<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta name="referrer" content="never" />
  
  
  <meta name="description" content="用于总结个人学习Linux的过程，首先给自己的一点建议，命令要胆大心细的尝试，有自己的认知，不然要畏手畏脚，环境坏了可以重新装，做好备份之后就可以更随意的尝试了，如果不熟悉安装虚拟机，那么也可以多尝试装各种版本的虚拟机，看看他们的不同之处。以下实验截图不分先后，以截图为准。" />
  

  
  
  <meta name="google-site-verification" content="NCXVSqxqB-os803-VFMtIEd1SUNJVOIjctCfNYUwD0w" />
  <meta name="baidu-site-verification" content="Nzwx7HuplM" />
  
  <meta name="msvalidate.01" content="9E9EA92F7E5327E1FE8A5196D5253664" />
  
  
  
  <title>Linux学习 | masuo777的博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="用于总结个人学习Linux的过程，首先给自己的一点建议，命令要胆大心细的尝试，有自己的认知，不然要畏手畏脚，环境坏了可以重新装，做好备份之后就可以更随意的尝试了，如果不熟悉安装虚拟机，那么也可以多尝试装各种版本的虚拟机，看看他们的不同之处。以下实验截图不分先后，以截图为准。">
<meta property="og:type" content="article">
<meta property="og:title" content="Linux学习">
<meta property="og:url" content="https://masuo777.github.io/2021/09/15/Linux/index.html">
<meta property="og:site_name" content="masuo777的博客">
<meta property="og:description" content="用于总结个人学习Linux的过程，首先给自己的一点建议，命令要胆大心细的尝试，有自己的认知，不然要畏手畏脚，环境坏了可以重新装，做好备份之后就可以更随意的尝试了，如果不熟悉安装虚拟机，那么也可以多尝试装各种版本的虚拟机，看看他们的不同之处。以下实验截图不分先后，以截图为准。">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://doc.shiyanlou.com/linux_base/1-8.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20210930174255.png">
<meta property="og:image" content="https://doc.shiyanlou.com/linux_base/1-1.png">
<meta property="og:image" content="https://dn-simplecloud.shiyanlou.com/uid/c4ca4238a0b923820dcc509a6f75849b/1467262784463.png">
<meta property="og:image" content="https://doc.shiyanlou.com/linux_base/1-7.jpg">
<meta property="og:image" content="https://doc.shiyanlou.com/linux_base/2-1.png">
<meta property="og:image" content="https://doc.shiyanlou.com/document-uid735639labid2timestamp1531471792103.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021130056.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021130129.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211024221631025.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025213859712.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211110131820.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211111130124.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211111150552.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220113104725.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220113111748.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220113114938.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220113113212.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220118111753.png">
<meta property="og:image" content="https://www.runoob.com/wp-content/uploads/2016/04/576507-docker1.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112100524.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112101603.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112102429.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112103617.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112103836.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112112901.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112130245.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112170013.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220111171803.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220118110703.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220111172059.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220111172338.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220118110447.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025194421917.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025194337599.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220315175244.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220316090334.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220316090740.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211014133613.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015130124.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015131629.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015132200.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015132658.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018131344.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015132944.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015133244.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015133629.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018131621.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018131932.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018132932.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018133042.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018133503.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019131135.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020132329.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020132739.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020132930.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020133031.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020133637.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020133901.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020134331.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020192728820.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020193104297.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020194312944.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020194706230.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020200745864.png">
<meta property="og:image" content="c:/Users/Mashuo/AppData/Roaming/Typora/typora-user-images/image-20211020200926733.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020201235369.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019123639.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019123804.png">
<meta property="og:image" content="https://doc.shiyanlou.com/linux_base/3-9.png">
<meta property="og:image" content="https://doc.shiyanlou.com/linux_base/3-10.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019130130.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019130533.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019130528.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020201401458.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020205703891.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020210632645.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020210737333.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020205812075.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020210059963.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020210439380.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020214128698.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020214025621.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020225250271.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020225617805.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019132021.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019132529.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019133205.png">
<meta property="og:image" content="https://doc.shiyanlou.com/linux_base/3-14.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019133205.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019133543.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211024215745065.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211024220513989.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211024220751744.png">
<meta property="og:image" content="https://doc.shiyanlou.com/linux_base/5-8.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20210930174255.png">
<meta property="og:image" content="https://doc.shiyanlou.com/document-uid18510labid59timestamp1482919171956.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020130952.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021131200.png">
<meta property="og:image" content="https://doc.shiyanlou.com/linux_base/5-2.png">
<meta property="og:image" content="https://doc.shiyanlou.com/linux_base/5-3.png">
<meta property="og:image" content="https://doc.shiyanlou.com/courses/uid871732-20200303-1583220161661">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021132341.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021132715.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021133130.png">
<meta property="og:image" content="https://doc.shiyanlou.com/document-uid735639labid60timestamp1532339433567.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021133609.png">
<meta property="og:image" content="https://doc.shiyanlou.com/courses/uid871732-20200303-1583223324878">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211022131312.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211022131257.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211022133342.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211024215123049.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025215818680.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025215850033.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025221843194.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025221909023.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025222214153.png">
<meta property="og:image" content="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025222246563.png">
<meta property="article:published_time" content="2021-09-14T16:00:00.000Z">
<meta property="article:modified_time" content="2022-03-16T01:28:01.142Z">
<meta property="article:author" content="John Doe">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://doc.shiyanlou.com/linux_base/1-8.png">
  
    <link rel="alternative" href="/atom.xml" title="masuo777的博客" type="application/atom+xml">
  
  
    <link rel="icon" href="http://7u2hdm.com1.z0.glb.clouddn.com/favicon.ico">
  
  
<link rel="stylesheet" href="/css/style.css">

  

  
  <!-- baidu webmaster push -->
  <script src='//push.zhanzhang.baidu.com/push.js'></script>
<meta name="generator" content="Hexo 5.4.0"></head>
<body class="home blog custom-background custom-font-enabled single-author">
  <div id="page" class="hfeed site">
      <header id="masthead" class="site-header" role="banner">
    <hgroup>
      <h1 class="site-title">
        <a href="/" title="masuo777的博客" rel="home">masuo777的博客</a>
      </h1>
      
        <script type="text/javascript" src="http://api.hitokoto.us/rand?encode=js&charset=utf-8"></script>
        <h2 class="site-description"><script>hitokoto();</script></h2>
      
    </hgroup>

    <nav id="site-navigation" class="main-navigation" role="navigation">
            <button class="menu-toggle">菜单</button>
            <a class="assistive-text" href="/#content" title="跳至内容">跳至内容</a><!--TODO-->
            <div class="menu-main-container">
                <ul id="menu-main" class="nav-menu">
                
                    <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/">MDS</a></li>
                
                    <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/todo">ToDo</a></li>
                
                    <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/images">images</a></li>
                
                    <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/about">ME</a></li>
                
                    <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/works">作品集</a></li>
                
                    <li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/tools">工具集</a></li>
                
                    <li class="menu-item menu-item-type-post_type menu-item-object-page"><a target="_blank" rel="noopener" href="https://github.com/Masuo777">my github</a></li>
                
                </ul>
            </div>
    </nav>
</header>
      <div id="main" class="wrapper">
        <div id="primary" class="site-content"><div id="content" role="main"><article id="post-Linux" class="post-Linux post type-post status-publish format-standard hentry">
    <!---->

      <header class="entry-header">
        
        
  
    <h1 class="entry-title article-title">
      Linux学习
    </h1>
  

        
        <div class="comments-link">
            
            <a href="/2021/09/15/Linux/#comments" class="leave-reply">评论</a>
            
            <a href="javascript:void(0);" data-url="https://masuo777.github.io/2021/09/15/Linux/" data-id="cl3jit8nm000d2ojb86x32j24" class="leave-reply bdsharebuttonbox" data-cmd="more">分享</a>
        </div><!-- .comments-link -->
      </header><!-- .entry-header -->

    <div class="entry-content">
      
        <h1 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h1><h2 id="Linux学习路径图"><a href="#Linux学习路径图" class="headerlink" title="Linux学习路径图"></a>Linux学习路径图</h2><p><img src="https://doc.shiyanlou.com/linux_base/1-8.png" alt="img"></p>
<p>本文图如无特殊标注皆来自：<a target="_blank" rel="noopener" href="https://www.lanqiao.cn/courses/1">蓝桥云课</a>，仅供个人学习使用。当然学习Linux我也非常推荐蓝桥云课，不仅有免费的在线Linux可用，还有大量免费的教程，这不是广告，是我的使用体验。</p>
<h2 id="Linux文件系统结构图"><a href="#Linux文件系统结构图" class="headerlink" title="Linux文件系统结构图"></a>Linux文件系统结构图</h2><p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20210930174255.png" alt="LinuxFileSystemStructureMap"></p>
<span id="more"></span>



<h2 id="Linux为何物"><a href="#Linux为何物" class="headerlink" title="Linux为何物"></a>Linux为何物</h2><p>Linux就是一个操作系统（OS，Operate System），就像Windows或Mac OS。</p>
<p>Linux主要是系统调用和内核那两层，想一下就知道了，首先Linux不能是硬件，虽然说操作系统也算是应用程序，但是他是特殊的应用程序—操作系统。</p>
<p><img src="https://doc.shiyanlou.com/linux_base/1-1.png" alt="img"></p>
<h2 id="Linux历史"><a href="#Linux历史" class="headerlink" title="Linux历史"></a>Linux历史</h2><p>操作系统始于二十世纪五十年代，当时的操作系统能运行批处理程序。批处理程序不需要用户的交互，它从文件或者穿孔卡片读取数据，然后输出到另外一个文件或者打印机。</p>
<p>二十世纪六十年代初，交互式操作系统开始流行。它不仅仅可以交互，还能使多个用户从不同的终端同时操作主机。这样的操作系统被称作分时操作系统，它的出现对批处理操作系统是个极大的挑战。许多人尝试开发分时操作系统， 其中包括一些大学的研究项目和商业项目。当时有个项目叫做 Multics ，它的技术在当时很具有创新性。 Multics 项目的开发并不顺利，它花费了远超过预计的资金，却没有在操作系统市场上占到多少份额。而参加该项目的一个开发团体——贝尔实验室退出了这个项目。他们在退出后开发了他们自己的一个操作系统—— UNIX 。</p>
<p>UNIX 最初免费发布并因此在大学里受到欢迎。后来，UNIX 实现了 TCP/IP 协议栈，成为了早期工作站的操作系统的一个流行选择。</p>
<p>1990 年，UNIX 在服务器市场上尤其是大学校园中成为主流操作系统，许多校园都有 UNIX 主机，当然还包括一些研究它的计算机系的学生。这些学生都渴望能在自己的电脑上运行 UNIX 。不幸的是，从那时候开始，UNIX 开始变得商业化，它的价格也变得非常昂贵。而唯一低廉的选择就是 MINIX，这是一个功能有限的类似 UNIX 的操作系统，作者 Andrew Tanenbaum 开发它的目的是用于教学。</p>
<p>1991 年 10 月，Linus Torvalds（Linux 之父）在赫尔辛基大学接触 UNIX，他希望能在自己的电脑上运行一个类似的操作系统。可是 UNIX 的商业版本非常昂贵，于是他从 MINIX 开始入手，计划开发一个比 MINIX 性能更好的操作系统。很快他就开始了自己的开发工作。他第一次发行的版本迅速吸引了一些黑客。尽管最初的 Linux 并没有多少用处，但由于一些黑客的加入使它很快就具有了许多吸引人的特性，甚至一些对操作系统开发不感兴趣的人也开始关注它。</p>
<p>Linux 本身只是操作系统的内核。内核是使其它程序能够运行的基础。它实现了多任务和硬件管理，用户或者系统管理员交互运行的所有程序实际上都运行在内核之上。其中有些程序是必需的，比如说，命令行解释器（shell），它用于用户交互和编写 shell 脚本。 Linus 没有自己去开发这些应用程序，而是使用已有的自由软件。这减少了搭建开发环境所需花费的工作量。实际上，他经常改写内核，使得那些程序能够更容易地在 Linux 上运行。许多重要的软件，包括 C 编译器，都来自于自由软件基金 GNU 项目。GNU 项目开始于 1984 年，目的是为了开发一个完全类似于 UNIX 的免费操作系统。为了表扬 GNU 对 Linux 的贡献，许多人把 Linux 称为 GNU/Linux（GNU 有自己的内核）。</p>
<p>1992－1993 年，Linux 内核具备了挑战 UNIX 的所有本质特性，包括 TCP/IP 网络，图形界面系统（X window )，Linux 同样也吸引了许多行业的关注。一些小的公司开始开发和发行 Linux，有几十个 Linux 用户社区成立。1994 年，Linux 杂志也开始发行。</p>
<p>Linux 内核 1.0 在 1994 年 3 月发布，内核的发布要经历许多开发周期，直至达到一个稳定的版本。</p>
<p>下面列举一些 Linux 诞生大事件：</p>
<ul>
<li><p>1965 年，Bell 实验室、MIT、GE（通用电气公司）准备开发 Multics 系统，为了同时支持 300 个终端访问主机，但是 1969 年失败了；</p>
<blockquote>
<p>那时候并没有鼠标、键盘，输入设备，只有卡片机。因此，如果要测试某个程序，则需要将读卡纸插入卡片机，如果有错误，还需要重新来过；</p>
<p>Multics : Multiplexed Information and Computing Service；</p>
</blockquote>
</li>
<li><p>1969 年，Ken Thompson（C 语言之父）利用汇编语言开发了 File Server System（Unics，即 UNIX 的原型）；</p>
<blockquote>
<p>因为汇编语言对于硬件的依赖性，因此只能针对特定硬件； 只是为了移植一款“太空旅游”的游戏；</p>
</blockquote>
</li>
<li><p>1973 年，Dennis Ritchie 和 Ken Thompson 发明了 C 语言，而后写出了 UNIX 的内核；</p>
<blockquote>
<p>将 B 语言改成 C 语言，由此产生了 C 语言之父；90% 的代码是 C 语言写的，10% 的代码用汇编语言写的，因此移植时只要修改那 10% 的代码即可；</p>
</blockquote>
</li>
<li><p>1977 年，Berkeley 大学的 Bill Joy 针对他的机器修改了 UNIX 源码，称为 BSD（Berkeley Software Distribution）；</p>
<blockquote>
<p>Bill Joy 是 Sun 公司的创始人；</p>
</blockquote>
</li>
<li><p>1979 年，UNIX 发布 System V，用于个人计算机；</p>
</li>
<li><p>1984 年，因为 UNIX 规定“不能对学生提供源码”，Tanenbaum 老师自己编写兼容于 UNIX 的 Minix，用于教学；</p>
</li>
<li><p>1984 年，Stallman 开始 GNU（GNU’s Not Unix）项目，创办 FSF（Free Software Foundation）基金会；</p>
<blockquote>
<p>产品：GCC、Emacs、Bash Shell、GLIBC；倡导“自由软件”；GNU 的软件缺乏一个开放的平台运行，只能在 UNIX 上运行；自由软件指用户可以对软件做任何修改，甚至再发行，但是始终要挂着 GPL 的版权；自由软件是可以卖的，但是不能只卖软件，而是卖服务、手册等；</p>
</blockquote>
</li>
<li><p>1985 年，为了避免 GNU 开发的自由软件被其他人用作专利软件，因此创建 GPL（General Public License）版权声明；</p>
</li>
<li><p>1988 年，MIT 为了开发 GUI，成立了研发 XFree86 的组织；</p>
</li>
<li><p>1991 年，芬兰赫尔辛基大学的研究生 Linus Torvalds 基于 gcc、bash 开发了针对 386 机器的 Linux 内核；</p>
</li>
<li><p>1994 年，Torvalds 发布 Linux-v1.0；</p>
</li>
<li><p>1996 年，Torvalds 发布 Linux-v2.0，确定了 Linux 的吉祥物：企鹅。</p>
</li>
</ul>
<p>UNIX 进化史（UNIX 大家族族谱 1969-2013）：</p>
<p><img src="https://dn-simplecloud.shiyanlou.com/uid/c4ca4238a0b923820dcc509a6f75849b/1467262784463.png" alt="1"></p>
<h2 id="Linux-之父"><a href="#Linux-之父" class="headerlink" title="Linux 之父"></a>Linux 之父</h2><h3 id="Linus-Torvalds-芬兰赫尔辛基大学"><a href="#Linus-Torvalds-芬兰赫尔辛基大学" class="headerlink" title="Linus Torvalds - 芬兰赫尔辛基大学"></a>Linus Torvalds - 芬兰赫尔辛基大学</h3><p><img src="https://doc.shiyanlou.com/linux_base/1-7.jpg" alt="1"></p>
<h2 id="Linux与Windows的异同"><a href="#Linux与Windows的异同" class="headerlink" title="Linux与Windows的异同"></a>Linux与Windows的异同</h2><h4 id="1-免费与收费"><a href="#1-免费与收费" class="headerlink" title="1. 免费与收费"></a>1. 免费与收费</h4><ul>
<li>最新正版 Windows 10，需要付费购买；</li>
<li>Linux 免费或少许费用。</li>
</ul>
<h4 id="2-软件与支持"><a href="#2-软件与支持" class="headerlink" title="2. 软件与支持"></a>2. 软件与支持</h4><ul>
<li>Windows 平台：数量和质量的优势，不过大部分为收费软件；由微软官方提供重要支持和服务；</li>
<li>Linux 平台：大都为开源自由软件，用户可以修改定制和再发布，由于基本免费没有资金支持，部分软件质量和体验欠缺；由全球所有的 Linux 开发者和自由软件社区提供支持。</li>
</ul>
<h4 id="3-安全性"><a href="#3-安全性" class="headerlink" title="3. 安全性"></a>3. 安全性</h4><ul>
<li>Windows 平台：三天两头打补丁安装系统安全更新，还是会中病毒木马；</li>
<li>Linux 平台：要说 Linux 没有安全问题，那当然是不可能的，这一点仁者见仁智者见智，相对来说肯定比 Windows 平台要更加安全，使用 Linux 你也不用装某杀毒、某毒霸。</li>
</ul>
<h4 id="4-使用习惯"><a href="#4-使用习惯" class="headerlink" title="4. 使用习惯"></a>4. 使用习惯</h4><ul>
<li>Windows：普通用户基本都是纯图形界面下操作使用，依靠鼠标和键盘完成一切操作，用户上手容易，入门简单；</li>
<li>Linux：兼具图形界面操作（需要使用带有桌面环境的发行版）和完全的命令行操作，可以只用键盘完成一切操作，新手入门较困难，需要一些学习和指导（这正是我们要做的事情），一旦熟练之后效率极高。</li>
</ul>
<h4 id="5-可定制性"><a href="#5-可定制性" class="headerlink" title="5. 可定制性"></a>5. 可定制性</h4><ul>
<li>Windows：这些年之前算是全封闭的，系统可定制性很差；</li>
<li>Linux：你想怎么做就怎么做，Windows 能做到得它都能，Windows 做不到的，它也能。</li>
</ul>
<h4 id="6-应用范畴"><a href="#6-应用范畴" class="headerlink" title="6. 应用范畴"></a>6. 应用范畴</h4><p>或许你之前不知道 Linux ，要知道，你之前在 Windows 使用百度、谷歌，上淘宝，聊 QQ 时，支撑这些软件和服务的，是后台成千上万的 Linux 服务器主机，它们时时刻刻都在忙碌地进行着数据处理和运算，可以说世界上大部分软件和服务都是运行在 Linux 之上的。</p>
<h4 id="7-Windows-没有的"><a href="#7-Windows-没有的" class="headerlink" title="7. Windows 没有的"></a>7. Windows 没有的</h4><ul>
<li>稳定的系统</li>
<li>安全性和漏洞的快速修补</li>
<li>多用户</li>
<li>用户和用户组的规划</li>
<li>相对较少的系统资源占用</li>
<li>可定制裁剪，移植到嵌入式平台（如安卓设备）</li>
<li>可选择的多种图形用户界面（如 GNOME，KDE）</li>
</ul>
<h4 id="8-Linux-没有的"><a href="#8-Linux-没有的" class="headerlink" title="8. Linux 没有的"></a>8. Linux 没有的</h4><ul>
<li>特定的支持厂商</li>
<li>足够的游戏娱乐支持度</li>
<li>足够的专业软件支持度</li>
</ul>
<h2 id="Linux桌面环境"><a href="#Linux桌面环境" class="headerlink" title="Linux桌面环境"></a>Linux桌面环境</h2><h4 id="1-Linux-桌面环境介绍"><a href="#1-Linux-桌面环境介绍" class="headerlink" title="1.Linux 桌面环境介绍"></a>1.Linux 桌面环境介绍</h4><p>相对于现在的 Windows 系统，UNIX/Linux 本身是没有图形界面的，我们通常在 UNIX/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件，类似 Windows95 之前的 Windows 的图形界面实则也只是运行在 DOS 环境的一套软件。而 Linux 上的这套软件以前是 XFree86，现在则是 xorg（X.Org），而这套软件又是通过 X 窗口系统（X Window System，也常被称为 X11 或 X）实现的，X 本身只是工具包及架构协议，而 xorg 便是 X 架构规范的一个实现体，也就是说它是实现了 X 协议规范的一个提供图形界面服务的服务器，就像实现了 http 协议提供 web 服务的 Apache 。如果只有服务器也是不能实现一个完整的桌面环境的，当然还需要一个客户端，我们称为 X Client，像如下几个大家熟知也最流行的实现了客户端功能的桌面环境 <strong>KDE</strong>，<strong>GNOME</strong>，<strong>XFCE</strong>，<strong>LXDE</strong> 。其中就有你看到的，实验楼目前使用的 <strong>XFCE</strong> 桌面环境，部分老用户可能可以回想起，实验楼之前使用的环境是 <strong>LXDE</strong> 。这也意味着在 Linux 上你可以自己选择安装不同的桌面环境，甚至可以定制自己的专属桌面。</p>
<p><img src="https://doc.shiyanlou.com/linux_base/2-1.png" alt="1"></p>
<p>这里讲这么多，主要是为了帮助你更好地理解 Linux 的桌面环境是一个怎样的概念，以及它跟 Windows 操作系统桌面的差异，实际它们之间是有着本质的差别的，希望清楚这些内容之后可以让你忽略那些体验上的差异，专心把精力放到 Linux 系统本身或者你正准备学习的某一门技术之上，这门实验课后面的内容和实验楼的其它课程便是为了帮助你实现以上两个目标。</p>
<h4 id="2-Linux-桌面环境的使用"><a href="#2-Linux-桌面环境的使用" class="headerlink" title="2.Linux 桌面环境的使用"></a>2.Linux 桌面环境的使用</h4><p>如果你对当前实验桌面环境（xfce）的使用有任何困难，建议你先学习<a target="_blank" rel="noopener" href="https://www.lanqiao.cn/courses/63">实验楼入门基础课程</a>，对于其它桌面环境的使用，不在本课程的范围之内，有兴趣的用户可以在自己的计算机中安装完整的 Linux 发行版或其 Live CD 体验。</p>
<h2 id="Linux终端"><a href="#Linux终端" class="headerlink" title="Linux终端"></a>Linux终端</h2><p>通常我们在使用 Linux 时，并不是直接与系统打交道，而是通过一个叫做 Shell 的中间程序来完成的，在图形界面下为了实现让我们在一个窗口中完成用户输入和显示输出，Linux 系统还提供了一个叫做终端模拟器的程序（Terminal）。 下面是几个比较常见的终端模拟器： gnome-terminal，Konsole，xterm，rxvt，kvt，nxterm 和 eterm 。目前我们的实验中的终端程序是 xfce 桌面环境自带的 xfce-terminal 。不过要注意的是这里所说的终端（Terminal）和控制台（Console）是有区别的。</p>
<p><img src="https://doc.shiyanlou.com/document-uid735639labid2timestamp1531471792103.png" alt="1"></p>
<p>终端本质上是对应着 Linux 上的 /dev/tty 设备，Linux 的多用户登录就是通过不同的 /dev/tty 设备完成的，Linux 默认提供了 6 个纯命令行界面的 “terminal”（准确的说这里应该是 6 个 virtual consoles）来让用户登录。在物理机系统上你可以通过使用<code>[Ctrl]</code>+<code>[Alt]</code>+<code>[F1]～[F6]</code>进行切换，当你切换到其中一个终端后想要切换回图形界面，你可以按下<code>[Ctrl]</code>+<code>[Alt]</code>+<code>[F7]</code>来完成。</p>
<h2 id="shell"><a href="#shell" class="headerlink" title="shell"></a>shell</h2><p>通常在图形界面中对实际体验带来差异的不是上述的不同发行版的各种终端模拟器，而是这个 Shell（壳）。有壳就有核，这里的核就是指 UNIX/Linux 内核，Shell 是指“提供给使用者使用界面”的软件（命令解析器），类似于 DOS 下的 command（命令行）和后来的 cmd.exe 。普通意义上的 Shell 就是可以接受用户输入命令的程序。它之所以被称作 Shell 是因为它隐藏了操作系统底层的细节。同样的 UNIX/Linux 下的图形用户界面 GNOME 和 KDE，有时也被叫做“虚拟 shell”或“图形 shell”。</p>
<p>UNIX/Linux 操作系统下的 Shell 既是用户交互的界面，也是控制系统的脚本语言。当然这一点也有别于 Windows 下的命令行，虽然该命令行也提供了很简单的控制语句。在 Windows 操作系统下，有些用户从来都不会直接使用 Shell，然而在 UNIX 系列操作系统下，Shell 仍然是控制系统启动、X11 启动和很多其它实用工具的脚本解释程序。</p>
<p>在 UNIX/Linux 中比较流行的常见的 Shell 有 bash、zsh、ksh、csh 等等，Ubuntu 终端默认使用的是 bash，默认的桌面环境是 GNOME 或者 Unity（基于 GNOME），但我们的环境中使用的分别是 zsh 和 xfce。</p>
<h2 id="Linux的哲学"><a href="#Linux的哲学" class="headerlink" title="Linux的哲学"></a>Linux的哲学</h2><p>==没有结果就是最好的结果==</p>
<h2 id="IO"><a href="#IO" class="headerlink" title="IO"></a>IO</h2><p>IO 是贯穿计算机的一个非常重要的。。enmmm，怎么说，功能？部分吧。</p>
<p>IO是贯穿计算机的一个非常重要的部分。</p>
<p>在 Linux中，最最重要的就是命令，这就包含了 2 个过程，输入和输出</p>
<ul>
<li>输入：输入当然就是打开终端，然后按键盘输入，然后按回车，输入格式一般就是这类的</li>
<li>输出：输出会返回你想要的结果，比如你要看什么文件，就会返回文件的内容。如果只是执行，执行失败会告诉你哪里错了，如果执行成功那么会没有输出，因为 Linux的哲学就是：没有结果就是最好的结果</li>
</ul>
<h2 id="向系统获取帮助"><a href="#向系统获取帮助" class="headerlink" title="向系统获取帮助"></a>向系统获取帮助</h2><p>在 Linux 环境中，如果你遇到困难，可以使用<code>man</code>命令，它是<code>Manual pages</code>的缩写。</p>
<p>Manual pages 是 UNIX 或类 UNIX 操作系统中在线软件文档的一种普遍的形式， 内容包括计算机程序（包括库和系统调用）、正式的标准和惯例，甚至是抽象的概念。用户可以通过执行<code>man</code>命令调用手册页。</p>
<p>你可以使用如下方式来获得某个命令的说明和使用方式的详细介绍：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">man &lt;command_name&gt;</span><br></pre></td></tr></table></figure>

<p>比如你想查看 man 命令本身的使用方式，你可以输入：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">man man</span><br></pre></td></tr></table></figure>

<p>通常情况下，man 手册里面的内容都是英文的，这就要求你有一定的英文基础。man 手册的内容很多，涉及了 Linux 使用过程中的方方面面。为了便于查找，man 手册被进行了分册（分区段）处理，在 Research UNIX、BSD、OS X 和 Linux 中，手册通常被分为 8 个区段，安排如下：</p>
<table>
<thead>
<tr>
<th>区段</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>一般命令</td>
</tr>
<tr>
<td>2</td>
<td>系统调用</td>
</tr>
<tr>
<td>3</td>
<td>库函数，涵盖了 C 标准函数库</td>
</tr>
<tr>
<td>4</td>
<td>特殊文件（通常是/dev 中的设备）和驱动程序</td>
</tr>
<tr>
<td>5</td>
<td>文件格式和约定</td>
</tr>
<tr>
<td>6</td>
<td>游戏和屏保</td>
</tr>
<tr>
<td>7</td>
<td>杂项</td>
</tr>
<tr>
<td>8</td>
<td>系统管理命令和守护进程</td>
</tr>
</tbody></table>
<p>要查看相应区段的内容，就在 man 后面加上相应区段的数字即可，如：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">man 1 ls</span><br></pre></td></tr></table></figure>

<p>会显示第一区段中的<code>ls</code>命令 man 页面。</p>
<p>所有的手册页遵循一个常见的布局，为了通过简单的 ASCII 文本展示而被优化，而这种情况下可能没有任何形式的高亮或字体控制。一般包括以下部分内容：</p>
<p><strong>NAME（名称）</strong></p>
<blockquote>
<p>该命令或函数的名称，接着是一行简介。</p>
</blockquote>
<p><strong>SYNOPSIS（概要）</strong></p>
<blockquote>
<p>对于命令，正式的描述它如何运行，以及需要什么样的命令行参数。对于函数，介绍函数所需的参数，以及哪个头文件包含该函数的定义。</p>
</blockquote>
<p><strong>DESCRIPTION（说明）</strong></p>
<blockquote>
<p>命令或函数功能的文本描述。</p>
</blockquote>
<p><strong>EXAMPLES（示例）</strong></p>
<blockquote>
<p>常用的一些示例。</p>
</blockquote>
<p><strong>SEE ALSO（参见）</strong></p>
<blockquote>
<p>相关命令或函数的列表。</p>
</blockquote>
<p>也可能存在其它部分内容，但这些部分没有得到跨手册页的标准化。常见的例子包括：OPTIONS（选项），EXIT STATUS（退出状态），ENVIRONMENT（环境），BUGS（程序漏洞），FILES（文件），AUTHOR（作者），REPORTING BUGS（已知漏洞），HISTORY（历史）和 COPYRIGHT（版权）。</p>
<p>通常 man 手册中的内容很多，你可能不太容易找到你想要的结果，不过幸运的是你可以在 man 中使用搜索<code>/&lt;你要搜索的关键字&gt;</code>，查找完毕后你可以使用<code>n</code>键切换到下一个关键字所在处，<code>shift+n</code>为上一个关键字所在处。使用<code>Space</code>（空格键）翻页，<code>Enter</code>（回车键）向下滚动一行，或者使用<code>k</code>，<code>j</code>（vim 编辑器的移动键）进行向前向后滚动一行。按下<code>h</code>键为显示使用帮助（因为 man 使用 less 作为阅读器，实为<code>less</code>工具的帮助），按下<code>q</code>退出。</p>
<p>想要获得更详细的帮助，你还可以使用<code>info</code>命令，不过通常使用<code>man</code>就足够了。如果你知道某个命令的作用，只是想快速查看一些它的某个具体参数的作用，那么你可以使用<code>--help</code>参数，大部分命令都会带有这个参数，如：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls --<span class="built_in">help</span></span><br></pre></td></tr></table></figure>









<h2 id="快捷键"><a href="#快捷键" class="headerlink" title="快捷键"></a>快捷键</h2><ul>
<li>【Tab】：补全命令，使用<code>Tab</code>键来进行命令补全，补全目录、补全命令参数都是没问题的</li>
<li>【Ctrl】+【C】：强行终止，可以使用<code>Ctrl+c</code>键来强行终止当前程序，并不会使终端退出</li>
<li>【Ctrl】+【D】：键盘输入结束或退出当前终端</li>
<li>【Ctrl】+【S】：暂停当前程序，暂停后按下任意键恢复运行</li>
<li>【Ctrl】+【Z】：将当前程序放到后台运行，恢复到前台为命令<code>fg</code></li>
<li>【Ctrl】+【A】：将光标移至输入行头，相当于<code>Home</code>键</li>
<li>【Ctrl】+【E】：将光标移至输入行末，相当于<code>End</code>键</li>
<li>【Ctrl】+【K】：删除从光标所在位置到行末</li>
<li>【Alt】+【Backspace】：向前删除一个单词</li>
<li>【Shift】+【PgUp】：将终端显示向上滚动</li>
<li>【Shift】+【PgDn】：将终端显示向下滚动</li>
<li>【⬆】：当前命令的上一个历史命令</li>
<li>【⬇】：当前命令的下一个历史命令</li>
<li>【-】：回到上一次目录</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
<li>【】：</li>
</ul>
<h2 id="Shell-常用通配符"><a href="#Shell-常用通配符" class="headerlink" title="Shell 常用通配符"></a>Shell 常用通配符</h2><table>
<thead>
<tr>
<th>字符</th>
<th>含义</th>
</tr>
</thead>
<tbody><tr>
<td><code>*</code></td>
<td>匹配 0 或多个字符</td>
</tr>
<tr>
<td><code>?</code></td>
<td>匹配任意一个字符</td>
</tr>
<tr>
<td><code>[list]</code></td>
<td>匹配 list 中的任意单一字符</td>
</tr>
<tr>
<td><code>[^list]</code></td>
<td>匹配 除 list 中的任意单一字符以外的字符</td>
</tr>
<tr>
<td><code>[c1-c2]</code></td>
<td>匹配 c1-c2 中的任意单一字符 如：[0-9][a-z]</td>
</tr>
<tr>
<td><code>&#123;string1,string2,...&#125;</code></td>
<td>匹配 string1 或 string2 (或更多)其一字符串</td>
</tr>
<tr>
<td><code>&#123;c1..c2&#125;</code></td>
<td>匹配 c1-c2 中全部字符 如{1..10}</td>
</tr>
</tbody></table>
<h1 id="入门兴趣"><a href="#入门兴趣" class="headerlink" title="入门兴趣"></a>入门兴趣</h1><blockquote>
<p>一下实验皆是在Ubuntu环境下完成。</p>
</blockquote>
<h2 id="开眼"><a href="#开眼" class="headerlink" title="开眼"></a>开眼</h2><p>在进入正文之前，我们先来“开个眼”。</p>
<p>输入如下命令：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nohup xeyes &amp;</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021130056.png" alt="image-20211021130055440"></p>
<p>然后就会出现</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021130129.png" alt="image-20211021130127586"></p>
<p>至于如何关掉这双眼，看他无辜可爱的样子，还是别关了吧。（此时悄悄输入<code>sudo kill 1845</code>,这里的1845时刚才输入<code>nohup xeyes &amp;</code> 命令后，出现的那一串数字，这是他的进程id）</p>
<h2 id="数字雨"><a href="#数字雨" class="headerlink" title="数字雨"></a>数字雨</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get update</span><br><span class="line">sudo apt-get cmatrix # 下载所需软件</span><br><span class="line">cmatrix </span><br></pre></td></tr></table></figure>



<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211024221631025.png" alt="image-20211024221631025"></p>
<h2 id="电子火炉"><a href="#电子火炉" class="headerlink" title="电子火炉"></a>电子火炉</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install libaa-bin</span><br><span class="line">aafire</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025213859712.png" alt="image-20211025213859712"></p>
<p>使用命令是不是很有趣。</p>
<hr>
<h1 id="Linux必备"><a href="#Linux必备" class="headerlink" title="Linux必备"></a>Linux必备</h1><blockquote>
<p>这些可以在你了解一定的Linux命令后再来。</p>
</blockquote>
<h2 id="Vim"><a href="#Vim" class="headerlink" title="Vim"></a>Vim</h2><p>Vim是一个类似于<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/Vi/8987313">Vi</a>的著名的功能强大、高度可定制的<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91%E5%99%A8/8853160">文本编辑器</a>，在Vi的基础上改进和增加了很多特性。VIM是<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/%E8%87%AA%E7%94%B1%E8%BD%AF%E4%BB%B6/405190">自由软件</a>。Vim普遍被推崇为类<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/Vi%E7%BC%96%E8%BE%91%E5%99%A8">Vi编辑器</a>中最好的一个，事实上真正的劲敌来自Emacs的不同变体。1999 年<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/Emacs">Emacs</a>被选为Linux world文本编辑分类的优胜者，Vim屈居第二。但在2000年2月Vim赢得了Slashdot Beanie的最佳<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/%E5%BC%80%E6%94%BE%E6%BA%90%E4%BB%A3%E7%A0%81/114160">开放源代码</a>文本编辑器大奖，又将Emacs推至二线， 总的来看， Vim和Emacs在文本编辑方面都是非常优秀的。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> Ubuntu</span></span><br><span class="line">sudo apt-get install vim </span><br><span class="line"><span class="meta">#</span><span class="bash"> CentOS</span></span><br><span class="line">sudo yum -y install vim </span><br></pre></td></tr></table></figure>

<h2 id="Git"><a href="#Git" class="headerlink" title="Git"></a>Git</h2><p>不论是Windows还是Linux，Git都是一款非常好用的版本管理工具。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> Ubuntu</span></span><br><span class="line">sudo apt-get insatll git </span><br><span class="line"><span class="meta">#</span><span class="bash"> CentOS</span></span><br><span class="line">sudo yum -y install git </span><br></pre></td></tr></table></figure>

<h2 id="ZSH"><a href="#ZSH" class="headerlink" title="ZSH"></a>ZSH</h2><blockquote>
<p>ZSH，又称Z-shell，与bash相似，都是用来执行命令的。但是与bash不同的是，它具有更多的可变性，可读性，可扩展性，是Linux开发时的一款”利器”。具有高亮命令，自动补全，历史命令提示等多种功能插件。</p>
</blockquote>
<p>由于大多Linux默认使用<code>bash</code>作为默认的交互<code>shell</code>，所以如果我们想要使用<code>zsh</code>是需要自己去下载的。</p>
<p>由于Ubuntu和CentOS的不同，所以我这里会介绍两种系统下<code>zsh</code>的安装方式其原理相同，只是在命令上略有不同，没有标注则表示两系统是相同的命令。</p>
<p>首先你需要知道当前的交互<code>shell</code>是什么。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">echo $0 #这会输出你当前的交互shell工具</span><br><span class="line">echo $SHELL #功能与上面命令相同</span><br></pre></td></tr></table></figure>

<p>当然你还需要知道你得系统都安装了哪写交互<code>shell</code>。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /etc/shells</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211110131820.png" alt="image-20211110131750565"></p>
<h3 id="下载zsh"><a href="#下载zsh" class="headerlink" title="下载zsh"></a>下载zsh</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install zsh #Ubuntu用户</span><br><span class="line">sudo yum -y install zsh #CentOS用户</span><br></pre></td></tr></table></figure>

<p>安装完成后你的<code>~</code>目录下会出现一个<code>.zshrc</code>的文件，这个就是<code>zsh</code>的配置文件。很多对<code>zsh</code>的配置都在这里进行。</p>
<p>安装完成后输入<code>zsh</code>就可以从<code>bash</code>切换到<code>zsh</code>，但是每次重启后都会默认启动<code>bash</code>，所以我们需要将默认的<code>shell</code>切换为<code>zsh</code>。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">chsh -s /bin/zsh # 切换默认的shell</span><br><span class="line">reboot #可以直接关闭终端，再重新打开就可以</span><br></pre></td></tr></table></figure>

<p>在你重新进入终端之后会有几个选项让你选择，你只需要选择第一个即可。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211111130124.png" alt="image-20211111130021740"></p>
<h3 id="安装oh-my-zsh"><a href="#安装oh-my-zsh" class="headerlink" title="安装oh-my-zsh"></a>安装oh-my-zsh</h3><blockquote>
<p>zsh 的强大不在于其本身，而在于拥有了oh-my-zsh之后的强大扩展性。</p>
</blockquote>
<p>安装<code>zsh</code>有多种方法，首先官方提供的下载方法</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 官网：https://ohmyz.sh/，官网中提供了两种下载方式</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 第一种，使用curl安装</span></span><br><span class="line">sh -c &quot;$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&quot;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 第二种，使用wget安装</span></span><br><span class="line">sh -c &quot;$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)&quot;</span><br></pre></td></tr></table></figure>

<p> 两种方法类似，都是利用模拟网站点击下载<code>install.sh</code>,在使用<code>zsh</code>的命令 <code>sh -c</code>来进行安装，所以这是两步命令。如果你的网络不支持直接进行下载，经常出现下载不下来而失败的。所以这里提供第二个安装方法。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> Gitee 是国内的Github，绝大多数Github上的项目，在此都可以找到副本，上面的问题最大的原因是网络不支持，所以我们换成国内地址，自己直接将代码拉下来，这样的话，我们就需要知道将下载下来的东西放哪，如果你成功下载过就会知道，oh-my-zsh是放在‘~’目录下的隐藏目录，所以</span></span><br><span class="line">cd ~ # 切换到当前用户目录下</span><br><span class="line">git clone https://gitee.com/mirrors/oh-my-zsh.git .oh-my-zsh #将ohmyzshclone到.oh-my-zsh目录下</span><br><span class="line">cp .oh-my-zsh/templates/zshrc.zsh-template .zshrc #将ohmyzsh下的zshrc.zsh-template替换。zshrc</span><br><span class="line">source .zshrc #使其生效，此时你会发现，自己的终端形式发生了变化</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211111150552.png" alt="image-20211111131346077"></p>
<p>第三种安装方法跟第二种方法类似，先使用外部网络下载<code>oh-my-zsh.zip</code>,将其放到当前用户目录下，替换本地<code>.zshrc</code>，使其生效。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line">```</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"><span class="comment">## 安装插件</span></span></span><br><span class="line"></span><br><span class="line">以下插件皆是本人累积的好用的zsh插件，你不一定现在用得上，但是日后应该会对你有帮助。</span><br><span class="line"></span><br><span class="line">- </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"><span class="comment"># Docker</span></span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">&gt;</span><span class="bash"> Docker 是一个开源的应用容器引擎，让开发者可以打包他们的应用以及依赖包到一个可移植的容器中，然后发布到任何流行的[Linux](https://baike.baidu.com/item/Linux)机器上，也可以实现虚拟化。</span></span><br><span class="line"><span class="meta">&gt;</span><span class="bash"></span></span><br><span class="line"><span class="bash">&gt; 容器是完全使用沙箱机制，相互之间不会有任何接口（类似 iPhone 的 app）,更重要的是容器性能开销极低。</span></span><br><span class="line"><span class="meta">&gt;</span><span class="bash"></span></span><br><span class="line"><span class="bash">&gt; Docker在17.03版本后分为CE（Community Edition社区版）和EE（Enterprise Edition: 企业版）版（类似JavaSE和JavaEE），我们安装时使用CE版即可。</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"><span class="comment">## 镜像</span></span></span><br><span class="line"></span><br><span class="line">Docker 镜像（**Image**），就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。</span><br><span class="line"></span><br><span class="line">官方镜像库：https://hub.docker.com/</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"><span class="comment">### 拉取镜像</span></span></span><br><span class="line"></span><br><span class="line">想拉啥来这找。直接搜就可。而且拉取命令都给你准备好了。所以这里就不进行多余的讲解了。</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"><span class="comment">### 查看镜像</span></span></span><br><span class="line"></span><br><span class="line">```bash</span><br><span class="line"><span class="meta">#</span><span class="bash"> 搜索镜像，这个不太准，建议直接去官网找</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> sudo docker search &lt;REPOSITORY&gt;:&lt;TAG&gt;</span></span><br><span class="line">sudo docker search mysql:5.7</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看本地镜像</span></span><br><span class="line">sudo docker images</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220113104725.png" alt="image-20220113104724258"></p>
<ul>
<li><strong>REPOSITORY：</strong>表示镜像的仓库源</li>
<li><strong>TAG：</strong>镜像的标签</li>
<li><strong>IMAGE ID：</strong>镜像ID</li>
<li><strong>CREATED：</strong>镜像创建时间</li>
<li><strong>SIZE：</strong>镜像大小</li>
</ul>
<h4 id="更新镜像"><a href="#更新镜像" class="headerlink" title="更新镜像"></a>更新镜像</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 更新镜像之前，我们需要先进入镜像实例，即容器</span></span><br><span class="line"><span class="comment"># 进入容器之后，更新，</span></span><br><span class="line">apt-get update</span><br><span class="line"><span class="comment"># 更新之后，提交该镜像</span></span><br><span class="line">sudo docker commit -m=<span class="string">&quot;update&quot;</span> -a=<span class="string">&quot;&quot;</span> &lt;容器名称/容器ID&gt; &lt;更新后容器名称&gt;</span><br><span class="line"><span class="comment"># t</span></span><br></pre></td></tr></table></figure>



<h4 id="删除镜像"><a href="#删除镜像" class="headerlink" title="删除镜像"></a>删除镜像</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 确保没有容器正在使用该镜像</span></span><br><span class="line">sudo docker rmi &lt;REPOSITORY&gt;</span><br><span class="line"><span class="comment"># or</span></span><br><span class="line">sudo docker rmi &lt;IMAGE ID&gt;</span><br></pre></td></tr></table></figure>

<h4 id="创建镜像"><a href="#创建镜像" class="headerlink" title="创建镜像"></a>创建镜像</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 注意创建镜像需要容器，所以需要先运行一个容器</span></span><br><span class="line"><span class="comment"># sudo docker commit -m=&lt;提交描述信息&gt; -a=&lt;作者&gt; &lt;CONTAINER ID&gt; &lt;镜像名&gt;</span></span><br><span class="line">sudo docker commit -m=<span class="string">&quot;new image&quot;</span> -a=<span class="string">&quot;mas&quot;</span> 348e529d63d2 mas/redis-1</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220113111748.png" alt="image-20220113111747118"></p>
<h3 id="容器"><a href="#容器" class="headerlink" title="容器"></a>容器</h3><p>镜像（<strong>Image</strong>）和容器（<strong>Container</strong>）的关系，就像是面向对象程序设计中的类和实例一样，镜像是静态的定义，容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。</p>
<h4 id="创建容器"><a href="#创建容器" class="headerlink" title="创建容器"></a>创建容器</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 无端口映射的容器创建</span></span><br><span class="line"><span class="comment"># sudo docker run -itd --name &lt;容器名称&gt; &lt;镜像名称&gt;</span></span><br><span class="line">sudo docker run -itd --name ubuntu-1 ubuntu </span><br><span class="line"></span><br><span class="line"><span class="comment"># 有端口映射的容器创建</span></span><br><span class="line"><span class="comment"># sudo docker run --name &lt;容器名称&gt; -p &lt;本机端口&gt;:&lt;容器端口&gt; -d &lt;镜像名称&gt;</span></span><br><span class="line"><span class="comment"># -p 8080:80： 端口进行映射，将本地 8080 端口映射到容器内部的 80 端口。</span></span><br><span class="line">sudo docker run --name nginx-1 -p 8080:80 -d nginx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 有端口映射，有版本控制，有环境变量需要传递的容器创建</span></span><br><span class="line"><span class="comment"># sudo docker run --name mysql-2 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql </span></span><br><span class="line">sudo docker run --name mysql-5.7-1 -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.36</span><br></pre></td></tr></table></figure>

<blockquote>
<p>-i：交互式操作</p>
<p>-t：终端</p>
<p>-d：后台运行</p>
<p>-p：端口映射</p>
<p>-e：传递环境变量</p>
</blockquote>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220113114938.png" alt="image-20220113114936760"></p>
<h5 id="MySQL容器"><a href="#MySQL容器" class="headerlink" title="MySQL容器"></a>MySQL容器</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># sudo docker run --name mysql-2 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql </span></span><br><span class="line">sudo docker run --name mysql-5.7-1 -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.36</span><br></pre></td></tr></table></figure>



<h5 id="Nginx容器"><a href="#Nginx容器" class="headerlink" title="Nginx容器"></a>Nginx容器</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -p 8080:80： 端口进行映射，将本地 8080 端口映射到容器内部的 80 端口。</span></span><br><span class="line">sudo docker run --name nginx-1 -p 8080:80 -d nginx</span><br></pre></td></tr></table></figure>





<h4 id="开关容器"><a href="#开关容器" class="headerlink" title="开关容器"></a>开关容器</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看所有容器的状态</span></span><br><span class="line">sudo docker ps -a</span><br><span class="line"></span><br><span class="line"><span class="comment"># 开启容器</span></span><br><span class="line"><span class="comment"># sudo docker start &lt;容器名称&gt;/&lt;容器id&gt;</span></span><br><span class="line">sudo docker start mysql-1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 关闭容器</span></span><br><span class="line"><span class="comment">#sudo docker stop &lt;容器名称&gt;/&lt;容器id&gt;</span></span><br><span class="line">sudo docker stop mysql-1</span><br></pre></td></tr></table></figure>

<blockquote>
</blockquote>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220113113212.png" alt="image-20220113113210988"></p>
<h4 id="查看容器"><a href="#查看容器" class="headerlink" title="查看容器"></a>查看容器</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 只会查看已运行中的容器</span></span><br><span class="line">sudo docker container ls</span><br></pre></td></tr></table></figure>

<h4 id="进入容器"><a href="#进入容器" class="headerlink" title="进入容器"></a>进入容器</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># exec ，使用这个命令在退出时不会对容器产生影响</span></span><br><span class="line"><span class="comment"># sudo docker exec -it &lt;容器名称&gt;/&lt;容器id&gt; &lt;命令&gt;</span></span><br><span class="line">sudo docker <span class="built_in">exec</span> -it mysql-1 /bin/bash</span><br><span class="line"></span><br><span class="line"><span class="comment"># attach,使用这个命令在退出容器时会顺便停止容器</span></span><br><span class="line"><span class="comment"># sudo docker attach &lt;容器名称&gt;/&lt;容器id&gt;</span></span><br><span class="line">sudo docker attach 1e560fca3906 </span><br></pre></td></tr></table></figure>

<h4 id="导出容器"><a href="#导出容器" class="headerlink" title="导出容器"></a>导出容器</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 导出容器到指定目录</span></span><br><span class="line">sudo docker <span class="built_in">export</span> &lt;容器名称/容器ID&gt; &gt; [指定目录../]&lt;容器.tar&gt;</span><br><span class="line"></span><br><span class="line">sudo docker <span class="built_in">export</span> mysql-5.7-1 &gt; 下载/mysql-5.7.tar</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220118111753.png" alt="image-20220118111753038"></p>
<h3 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h3><p>仓库(<strong>Repository</strong>)可看成一个代码控制中心，用来保存镜像。</p>
<blockquote>
<p>Docker 使用客户端-服务器 (C/S) 架构模式，使用远程API来管理和创建Docker容器。</p>
<p>Docker 容器通过 Docker 镜像来创建。</p>
<p>容器与镜像的关系类似于面向对象编程中的对象与类。</p>
<p><img src="https://www.runoob.com/wp-content/uploads/2016/04/576507-docker1.png" alt="img"></p>
</blockquote>
<h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><h4 id="先决条件"><a href="#先决条件" class="headerlink" title="先决条件"></a>先决条件</h4><blockquote>
<p>Docker需要较高的Linux内核版本,</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 查看内核</span></span><br><span class="line">uname -a</span><br></pre></td></tr></table></figure>



<h4 id="卸载旧版本"><a href="#卸载旧版本" class="headerlink" title="卸载旧版本"></a>卸载旧版本</h4><p>在安装之前，我们需要卸载旧版本，这里我们需要知道，旧版本与新版本的Docker有啥区别.</p>
<p>旧版Docker被称为Docker，Docker.io，Docker-engine。</p>
<ul>
<li>CentOS</li>
</ul>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">sudo yum remove docker \</span><br><span class="line">                  docker-client \</span><br><span class="line">                  docker-client-latest \</span><br><span class="line">                  docker-common \</span><br><span class="line">                  docker-latest \</span><br><span class="line">                  docker-latest-logrotate \</span><br><span class="line">                  docker-logrotate \</span><br><span class="line">                  docker-engine</span><br></pre></td></tr></table></figure>

<ul>
<li>Ubuntu</li>
</ul>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get remove docker \</span><br><span class="line">                  docker-client \</span><br><span class="line">                  docker-client-latest \</span><br><span class="line">                  docker-common \</span><br><span class="line">                  docker-latest \</span><br><span class="line">                  docker-latest-logrotate \</span><br><span class="line">                  docker-logrotate \</span><br><span class="line">                  docker-engine</span><br></pre></td></tr></table></figure>

<p>如果<code>shell</code>报告没有安装这些软件包，那也没关系。</p>
<p>Docker 引擎包现在被称为<code>docker-ce</code>.以往旧式的安装相对繁琐，如果你想学习，可以自行搜索。</p>
<h4 id="安装新版本"><a href="#安装新版本" class="headerlink" title="安装新版本"></a>安装新版本</h4><p>您可以根据需要以不同方式安装 Docker Engine,下面提供了三种安装docker的方式</p>
<ul>
<li><p>存储库安装</p>
<p>  大多数用户 <a target="_blank" rel="noopener" href="https://docs.docker.com/engine/install/centos/#install-using-the-repository">设置 Docker 的存储库</a>并从中安装，以便于安装和升级任务。这是推荐的方法。</p>
<p>  使用存储库的前提就是需要我们先进行<strong>设置存储库</strong>。</p>
<h5 id="设置存储库"><a href="#设置存储库" class="headerlink" title="设置存储库"></a>设置存储库</h5><ul>
<li>CentOS</li>
</ul>
  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 安装yum-utils包，提供yum-config-manager实用程序，设置稳定存储库</span></span><br><span class="line">sudo yum -y install yum-utils</span><br><span class="line"><span class="meta">#</span><span class="bash"> 给仓库设置源</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 官方源,较慢</span></span><br><span class="line">sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo</span><br><span class="line"><span class="meta">#</span><span class="bash"> 阿里云源</span></span><br><span class="line">sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class="line"><span class="meta">#</span><span class="bash"> 清华大学源</span></span><br><span class="line">sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo</span><br></pre></td></tr></table></figure>
<p>  <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112100524.png" alt="image-20211112100523210"></p>
<blockquote>
<p> <strong>可选</strong>：启用nightly或test存储库</p>
<p> 这些存储库包含在<code>docker.repo</code>上面的文件中，但默认情况下是禁用的。你可以在稳定存储库旁启动他们。</p>
<p> 启动nightly存储库：</p>
<p> <code>sudo yum-config-manager --enable docker-ce-nightly</code></p>
<p> 禁用nightly存储库：</p>
<p> <code>sudo yum-config-manager --disable docker-ce-nightly</code></p>
<p> 启动test存储库：</p>
<p> <code>sudo yum-config-manager --enable docker-ce-test</code></p>
<p> 禁用test存储库：</p>
<p> <code>sudo yum-config-manager --disable docker-ce-test</code></p>
</blockquote>
<ul>
<li>Ubuntu</li>
</ul>
  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">```</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"><span class="comment">#### 安装docker引擎</span></span></span><br><span class="line"></span><br><span class="line">- CentOS</span><br><span class="line"></span><br><span class="line">```shell</span><br><span class="line"><span class="meta">#</span><span class="bash"> 不指定版本安装</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 安装最新版的Docker Engine和containerd</span></span><br><span class="line">sudo yum -y install docker-ce docker-ce-cli containerd.io</span><br><span class="line"><span class="meta">#</span><span class="bash"> 如果提示接收GPG密钥，请验证指纹是否匹配`060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35`,如果匹配请接受。</span></span><br></pre></td></tr></table></figure>
<p>  <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112101603.png" alt="image-20211112101602163"></p>
<blockquote>
<p>如果你有多个Docker存储库，当你在下载的时候，如果没有指定版本，那么会默认下载最高版本。</p>
<p>此命令会安装Docker，但不会启动Docker，他还会创建一个<code>docker</code>组，但不会向该组添加用户。</p>
</blockquote>
  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 指定版本安装</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 在存储库中列出并排序可用版本，排序按照版本号进行排序，从高到低</span></span><br><span class="line">yum list docker-ce --showduplicates | sort -r</span><br></pre></td></tr></table></figure>
<p>  <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112102429.png" alt="image-20211112102428326"></p>
<blockquote>
<p>通过<strong>完全限定的包名</strong>进行安装，即使用<strong>包名称</strong>（<code>docker-ce</code>）加上从第一个冒号（<code>:</code>）开始的版本字符串（第二列），直到第一个<code>-</code>，如：<code>docker-ce-18.09.1</code>。</p>
</blockquote>
  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum install docker-ce-&lt;VERSION_STRING&gt; docker-ce-cli-&lt;VERSION_STRING&gt; containerd.io</span><br></pre></td></tr></table></figure>
<ul>
<li>Ubuntu</li>
</ul>
<h5 id="启动Docker"><a href="#启动Docker" class="headerlink" title="启动Docker"></a>启动Docker</h5>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl start docker # CentOS 和 Ubuntu的启动命令是一样的</span><br><span class="line"><span class="meta">#</span><span class="bash"> 启动时需要使用root用户或具有root权限的用户，并输入用户密码</span></span><br></pre></td></tr></table></figure>
<p>  <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112103617.png" alt="image-20211112103614385"></p>
<h5 id="试运行"><a href="#试运行" class="headerlink" title="试运行"></a>试运行</h5>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo docker run hello-world # 新下载的docker可能没有自带hello-world镜像，docker会自动从存储库进行拉取，只需静待几分钟即可。出现 `This message shows that your installation appears to be working correctly.` 表示你已经启动成功。</span><br></pre></td></tr></table></figure>
<p>  <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112103836.png" alt="image-20211112103834669"></p>
<h5 id="升级Docker引擎"><a href="#升级Docker引擎" class="headerlink" title="升级Docker引擎"></a>升级Docker引擎</h5><p>  要升级 Docker Engine，请按照<a target="_blank" rel="noopener" href="https://docs.docker.com/engine/install/centos/#install-using-the-repository">安装说明进行操作</a>，选择要安装的新版本。</p>
</li>
</ul>
<p>​    </p>
<ul>
<li><p>RPM包安装</p>
<blockquote>
<p>一些用户下载 RPM 包并 <a target="_blank" rel="noopener" href="https://docs.docker.com/engine/install/centos/#install-from-a-package">手动安装</a>并完全手动管理升级。这在诸如在无法访问互联网的系统上安装 Docker 等情况下非常有用。</p>
<p>如果你无法从Docker的存储库安装Docker,你可以下载<code>.rpm</code>版本的文件并手动安装,每次升级Docker Engine时都需要下载一个新文件.</p>
</blockquote>
<h5 id="下载-rpm包"><a href="#下载-rpm包" class="headerlink" title="下载.rpm包"></a>下载<code>.rpm</code>包</h5><p>  前往<a target="_blank" rel="noopener" href="https://download.docker.com/linux/centos/">Docker存储库</a>,选择你对应的版本,进入<code>x86_64/stable/Packages</code></p>
  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 查看自己的Linux版本</span></span><br><span class="line">cat /etc/redhat-release</span><br></pre></td></tr></table></figure>

<p>  <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112112901.png" alt="image-20211112112900739"></p>
<p>  在这里提醒大家,如果能用别的方法,尽量不要用这个方法,因为安装步骤繁琐,各个安装包之间的版本匹配也是一个大问题.</p>
<p>  一定要直到那个包跟哪个包是匹配的版本.不然就前功尽弃了.等你下载完匹配好的包之后,按照如下顺序去安装就可以了.</p>
  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum install package.rpm #执行之后,下面会提示你需要哪写依赖,你再根据提示下载依赖即可,尽量不要用这个方法.</span><br></pre></td></tr></table></figure>

<p>  <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112130245.png" alt="image-20211112130243570"></p>
<p>  如果你真的想试一下这个方法，你可以先使用第一种下载方式，他会告诉你你需要的依赖以及版本，例如<img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211112170013.png" alt="image-20211112170011864"></p>
<p>  从这张图片你可以看出<code>containerd.io_x86_64 1.4.11-3.1.el7</code>,<code>docker-ce.x86_64 20.10.10-3.el7</code>,<code>docker-ce-cli.x86_64 20.10.10-3.el7</code>,是一组版本，下面那些是依赖，自动安装，前提是你有网，没网的话还是需要自己下载下来，放到对应的文件。</p>
</li>
<li><p>自动脚本安装</p>
<blockquote>
<p>在测试和开发环境中，一些用户选择使用自动化的 <a target="_blank" rel="noopener" href="https://docs.docker.com/engine/install/centos/#install-using-the-convenience-script">便捷脚本</a>来安装 Docker。</p>
</blockquote>
<p>  Docker 在<a target="_blank" rel="noopener" href="https://get.docker.com/">get.docker.com</a> 上提供了一个方便的脚本，可以快速且非交互地将 Docker 安装到开发环境中。不建议将便捷脚本用于生产环境，但可以用作示例来创建适合您需求的配置脚本。另请参阅<a target="_blank" rel="noopener" href="https://docs.docker.com/engine/install/centos/#install-using-the-repository">使用存储库安装</a> 步骤以了解使用软件包存储库进行安装的安装步骤。该脚本的源代码是开源的，可以<a target="_blank" rel="noopener" href="https://github.com/docker/docker-install"><code>docker-install</code>在 GitHub 上</a>的 <a target="_blank" rel="noopener" href="https://github.com/docker/docker-install">存储库中找到</a>。</p>
<p>  在本地运行之前，请务必检查从 Internet 下载的脚本。在安装之前，让自己熟悉便利脚本的潜在风险和限制：</p>
<ul>
<li>脚本需要<code>root</code>或<code>sudo</code>特权才能运行。</li>
<li>该脚本尝试检测您的 Linux 发行版和版本并为您配置包管理系统，并且不允许您自定义大多数安装参数。</li>
<li>该脚本无需确认即可安装依赖项和建议。这可能会安装大量软件包，具体取决于主机的当前配置。</li>
<li>默认情况下，该脚本会安装 Docker、containerd 和 runc 的最新稳定版本。使用此脚本配置机器时，可能会导致 Docker 的主要版本意外升级。在部署到生产系统之前，始终在测试环境中测试（主要）升级。</li>
<li>该脚本并非旨在升级现有的 Docker 安装。使用脚本更新现有安装时，依赖项可能不会更新到预期版本，从而导致使用过时的版本。</li>
</ul>
<p>  您可以运行带有<code>DRY_RUN=1</code>选项的脚本以了解脚本在安装过程中将执行的步骤：</p>
  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash"> curl -fsSL https://get.docker.com -o get-docker.sh</span></span><br><span class="line"><span class="meta">$</span><span class="bash"> DRY_RUN=1 sh ./get-docker.sh</span></span><br></pre></td></tr></table></figure>

<p>  安装了 Docker。该<code>docker</code>服务在基于 Debian 的发行版上自动启动。在<code>RPM</code>基于发     行版的发行版上，例如 CentOS、Fedora、RHEL 或 SLES，您需要使用适<code>systemctl</code>or<code>service</code>命令手动启动它。如消息所示，默认情况下，非 root 用户无法运    行 Docker 命令。</p>
<p>  更多系统安装方法请查看<a target="_blank" rel="noopener" href="https://docs.docker.com/engine/install/">Docker官网</a></p>
</li>
</ul>
<h3 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h3><h4 id="Ⅰ"><a href="#Ⅰ" class="headerlink" title="Ⅰ"></a>Ⅰ</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220111171803.png" alt="image-20220111171800165"></p>
<p>首先，这个问题说的是docker的守护进程没有运行中。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220118110703.png" alt="img"></p>
<p>那么我们首先需要考虑<code>docker是否启动</code></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看docker运行状态</span></span><br><span class="line">sudo systemctl docker status</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220111172059.png" alt="image-20220111172058012"></p>
<p>我们可以看到，此时docker是<code>inactive(dead)</code>状态，即没有启动。</p>
<p>所以我们需要启动docker。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启动docker服务</span></span><br><span class="line">sudo systemctl start docker</span><br><span class="line"><span class="comment"># 再次查看docker运行状态</span></span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220111172338.png" alt="image-20220111172337583"></p>
<p>此时，在运行就没问题了。</p>
<hr>
<h4 id="Ⅱ"><a href="#Ⅱ" class="headerlink" title="Ⅱ"></a>Ⅱ</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">IPv4 forwarding is disabled. Networking will not work.</span><br></pre></td></tr></table></figure>

<p>在新建一个容器后，弹出了这个警告，大概就是IPv4被禁用了，网络不能使用。</p>
<p>我们需要在Linux中如下设置。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 编辑 /etc/sysctl.conf文件</span></span><br><span class="line">sudo vim /etc/sysctl.conf</span><br><span class="line"><span class="comment"># 添加如下 代码</span></span><br><span class="line">net.ipv4.ip_forward=1</span><br><span class="line"><span class="comment"># 重启服务</span></span><br><span class="line">systemctl restart network</span><br><span class="line">systemctl restart docker</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看值是否设置成功 出现 net.ipv4.ip_forward = 1  则代表成功</span></span><br><span class="line">sysctl net.ipv4.ip_forward</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除镜像，重新构建即可</span></span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220118110447.png" alt="image-20220118110447472"></p>
<hr>
<h2 id="开放端口"><a href="#开放端口" class="headerlink" title="开放端口"></a>开放端口</h2><p>对于Ubuntu用户来说，新配置的虚拟机是不会主动开放一些重要的端口的，如端口22用于SSH服务。但是我们如果想通过SSH从外部连接虚拟机，这个端口又必须打开，那么我们该怎么办呢？</p>
<p>注意：对于CentOS用户来说，22端口是默认开放的。</p>
<h3 id="Ubuntu"><a href="#Ubuntu" class="headerlink" title="Ubuntu"></a>Ubuntu</h3><p>那么接下来我们就来看一下如何打开这个端口。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo netstat -ntpl |grep 22 # 查看端口22的开放情况</span><br></pre></td></tr></table></figure>

<blockquote>
<p>-n  不以进程的服务名称，以端口号(port number)显示 </p>
<p>-t  列出TCP网络封包的信息</p>
<p>-l  列出目前正在网络监听(listen)服务 </p>
<p>-p  列出该网络服务的进程</p>
</blockquote>
<p>没有打开的情况：就是啥也没有输出，下面那个是另外一个命令</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025194421917.png" alt="image-20211025194421917"></p>
<p>打开的情况：<img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025194337599.png" alt="image-20211025194337599"></p>
<p>如果你的端口没有打开，那么你需要下载如下：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install openssh-server #下载开放ssh服务</span><br><span class="line">sudo apt-get install ufw # 下载防火墙服务，ufw:Uncomplicated FireWall,不要去下载iptables，非常的费事</span><br><span class="line">sudo ufw enable #启动ufw服务</span><br><span class="line">sudo ufw allow 22 #打开端口22，即允许外部服务访问本虚拟机的ssh服务</span><br></pre></td></tr></table></figure>

<p>这样你的SSH服务就开启了。你就可以通过外部链接虚拟机了。</p>
<hr>
<h3 id="CentOS"><a href="#CentOS" class="headerlink" title="CentOS"></a>CentOS</h3><blockquote>
<p>虽然CentOS默认开启22端口，但是在很多时候，我们需要开启其他端口（如8080、80）才能让外部访问我们的服务。所以我们需要知道CentOS如何开启端口</p>
<p>centos版本：7.9</p>
<p>开启端口有两种方法：</p>
<ul>
<li>关闭防火墙，一劳永逸，缺点就是，服务器不在安全，随时都会被攻击。</li>
<li>开启端口</li>
</ul>
</blockquote>
<h4 id="关闭防火墙"><a href="#关闭防火墙" class="headerlink" title="关闭防火墙"></a>关闭防火墙</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 查看防火墙的状态</span></span><br><span class="line">sudo systemctl status firewalld.service</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 如果Active的值显示active（running）就表示防火墙处于开启状态</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 关闭防火墙</span></span><br><span class="line">sudo systemctl stop firewalld.service</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220315175244.png" alt="image-20220315175244754"></p>
<h4 id="开启端口"><a href="#开启端口" class="headerlink" title="开启端口"></a>开启端口</h4><blockquote>
<p>但是，防火墙是保证服务器安全的第一道屏障，所以我们不能关闭防火墙。</p>
<p>那么我们如何保证在防火墙开启的情况下，还能够让外网能够访问服务器的服务呢，比如我们经常使用的8080、80端口？</p>
<p>此时我们需要在防火墙开启的情况下开启服务端口，外网仅且只能通过该端口访问服务器服务。</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 查看防火墙状态</span></span><br><span class="line">sudo systemctl status firewalld.service</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 开启防火墙</span></span><br><span class="line">sudo systemctl start firewalld.service</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看开启的端口</span></span><br><span class="line">sudo firewall-cmd --list-ports</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 开启8080端口服务</span></span><br><span class="line">sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp </span><br><span class="line"><span class="meta">#</span><span class="bash"> 开启80端口服务</span></span><br><span class="line">sudo firewall-cmd --zone=public --permanent --add-port=80/tcp </span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 重载防火墙配置，加载开启的端口服务，不重载的话，开启的服务不会生效</span></span><br><span class="line">sudo firewall-cmd --reload</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220316090334.png" alt="image-20220316090334056"></p>
<p>重载之后</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20220316090740.png" alt="image-20220316090740224"></p>
<p><strong>常用防火墙服务命令</strong></p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 查看防火墙状态，是否是running</span></span><br><span class="line">firewall-cmd --state </span><br><span class="line"><span class="meta">#</span><span class="bash"> 重新载入配置，比如添加规则之后，需要执行此命令</span></span><br><span class="line">firewall-cmd --reload </span><br><span class="line"><span class="meta">#</span><span class="bash"> 列出支持的zone</span></span><br><span class="line">firewall-cmd --get-zones </span><br><span class="line"><span class="meta">#</span><span class="bash"> 列出支持的服务，在列表中的服务是放行的</span></span><br><span class="line">firewall-cmd --get-services </span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看ftp服务是否支持，返回yes或者no</span></span><br><span class="line">firewall-cmd --query-service ftp </span><br><span class="line"><span class="meta">#</span><span class="bash"> 临时开放ftp服务</span></span><br><span class="line">firewall-cmd --add-service=ftp </span><br><span class="line"><span class="meta">#</span><span class="bash"> 永久开放ftp服务</span></span><br><span class="line">firewall-cmd --add-service=ftp --permanent </span><br><span class="line"><span class="meta">#</span><span class="bash"> 永久移除ftp服务</span></span><br><span class="line">firewall-cmd --remove-service=ftp --permanent </span><br><span class="line"><span class="meta">#</span><span class="bash"> 永久添加80端口</span></span><br><span class="line">firewall-cmd --add-port=80/tcp --permanent </span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看规则，这个命令是和iptables的相同的</span></span><br><span class="line">iptables -L -n </span><br></pre></td></tr></table></figure>



<hr>
<h1 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h1><p>那么接下来让我们进入实战操作环节，将详细介绍我学习Linux所涉及到的命令，当然这也是最主要的部分。</p>
<h2 id="Linux用户管理"><a href="#Linux用户管理" class="headerlink" title="Linux用户管理"></a>Linux用户管理</h2><p>Linux可以实现多用户登录，用户之间共享一些资源，也有一些资源是他们私有的。</p>
<h3 id="查看用户"><a href="#查看用户" class="headerlink" title="查看用户"></a>查看用户</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">who am i </span><br><span class="line">who mom likes</span><br><span class="line">whoami</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211014133613.png" alt="image-20211014132748249"></p>
<p>可以看到，输出信息包括三点，就目前来看，这三点分别为</p>
<ul>
<li><code>shiyanlou</code>:当前终端用户的用户名(如果你只想当前终端用户的用户名可以去掉空格直接输入whoami)</li>
<li><code>pts/0</code>:其中的<code>pts</code>表示伪终端，伪终端表示使用<code>/dev/tty7</code>打开时每打开一个终端就会产生一个伪终端，后面的0代表当前伪终端的序号。</li>
<li><code>2021-10-14 13:27(:1.0)</code>:表示当前终端启动的时间，所以这个是不会随时间改变而改变的。</li>
</ul>
<p><code>who</code> 命令其它常用参数</p>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>-a</code></td>
<td>打印能打印的全部</td>
</tr>
<tr>
<td><code>-d</code></td>
<td>打印死掉的进程</td>
</tr>
<tr>
<td><code>-m</code></td>
<td>同<code>am i</code>，<code>mom likes</code></td>
</tr>
<tr>
<td><code>-q</code></td>
<td>打印当前登录用户数及用户名</td>
</tr>
<tr>
<td><code>-u</code></td>
<td>打印当前登录用户登录信息</td>
</tr>
<tr>
<td><code>-r</code></td>
<td>打印运行等级</td>
</tr>
</tbody></table>
<p>更多请参考：<a target="_blank" rel="noopener" href="https://www.lanqiao.cn/courses/1/learning/">https://www.lanqiao.cn/courses/1/learning/</a></p>
<h3 id="创建用户"><a href="#创建用户" class="headerlink" title="创建用户"></a>创建用户</h3><p>在Linux系统中，root为王，拥有最高的权限。</p>
<blockquote>
<p>root 权限，系统权限的一种，与 SYSTEM 权限可以理解成一个概念，但高于 Administrator 权限，root 是 Linux 和 UNIX 系统中的超级管理员用户帐户，该帐户拥有整个系统至高无上的权力，所有对象他都可以操作，所以很多黑客在入侵系统的时候，都要把权限提升到 root 权限，这个操作等同于在 Windows 下就是将新建的非法帐户添加到 Administrators 用户组。更比如安卓操作系统中（基于 Linux 内核）获得 root 权限之后就意味着已经获得了手机的最高权限，这时候你可以对手机中的任何文件（包括系统文件）执行所有增、删、改、查的操作。</p>
</blockquote>
<p>我们在装Linux系统时都会新建一个用户，而不是使用root直接进行登录，当然也可以直接使用root登录。当我们以普通用户的身份登录时，如果我们需要用到新增权限时，我们就需要给当前用户更高的权限，这里我们需要用到<strong>sudo</strong>命令。</p>
<p>使用<strong>sudo</strong>的前提是我们知道当前用户的密码以及当前用户必须在sudo用户组。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo adduser 【用户名】</span><br><span class="line">注：用户名不能用大写字母开头</span><br><span class="line">例：</span><br><span class="line">sudo adduser marshio</span><br></pre></td></tr></table></figure>

<p>在输入命令<code>sudo adduser marshio</code>后,会输出出现一系列信息，然后会提示输入密码，再重复输入密码，之后一路回车即可。</p>
<p>在输出的信息里我们可以看到有一句<code>主目录&quot;/home/marshio&quot;已经存在。</code>，这是因为我之前创建过同名用户，且删除此用户时没有删除其目录。由此我们可知，在创建用户之后会在主目录（/home）下同时生成一个同名文件作为该用户的私人空间。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015130124.png" alt="image-20211015130123168"></p>
<p>此时我们输入<code>whoami</code>后，此时用户还是之前的用户，那么我们如何切换到新建的用户下呢？</p>
<h3 id="切换用户"><a href="#切换用户" class="headerlink" title="切换用户"></a>切换用户</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">su -l 【用户名】</span><br><span class="line">如：</span><br><span class="line">su -l marshio</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015131629.png" alt="image-20211015131628074"></p>
<p>通过上图我们可以更直观的了解<code>who am i</code>和<code>whoami</code>两个命令的区别。</p>
<p><code>pwd</code>命令是输出当前用户的根目录，当我们切换到<code>marshio</code>用户时，<code>pwd</code>命令输出的是<code>/home/marshio</code>,当我们切换到<code>shiyanlou</code>用户时，<code>pwd</code>命令输出的是<code>/home/shiyanlou</code>.</p>
<p>中间我退出<code>marshio</code>用户所用的是快捷键【Ctrl】+【D】。</p>
<p>当我们单独输入<code>su</code>命令时会发生什么呢？</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">su</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015132200.png" alt="image-20211015132159335"></p>
<p>可以看到此时我们是root用户，但是目录仍然是<code>/home/shiyanlou</code>.</p>
<h3 id="修改用户密码"><a href="#修改用户密码" class="headerlink" title="修改用户密码"></a>修改用户密码</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo passwd 【用户名】</span><br><span class="line">sudo passwd</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015132658.png" alt="image-20211015132655907"></p>
<p>我们经常会忘记密码，在Linux系统里，修改密码是不需要知道之前的密码的（就目前我使用的系统来说）.</p>
<p>如果不写用户名，默认修改的是当前登录用户。修改密码的前提是当前用户拥有<code>sudo</code>命令的权限，即当前用户需要在<code>sudo</code>用户组中。不然会提示<code>【用户名】不在sudoers文件中，此事将被报告</code>。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018131344.png" alt="image-20211018131342783"></p>
<p>那么什么是用户组呢？如何加入用户组？</p>
<h3 id="用户组"><a href="#用户组" class="headerlink" title="用户组"></a>用户组</h3><p>在 Linux 里面每个用户都有一个归属（用户组），用户组简单地理解就是一组用户的集合，它们共享一些资源和权限，同时拥有私有资源，就跟家的形式差不多，你的兄弟姐妹（不同的用户）属于同一个家（用户组），你们可以共同拥有这个家（共享资源），爸妈对待你们都一样（共享权限），你偶尔写写日记，其他人未经允许不能查看（私有资源和权限）。当然一个用户是可以属于多个用户组的，正如你既属于家庭，又属于学校或公司。</p>
<p>在 Linux 里面如何知道自己属于哪些用户组呢？</p>
<h4 id="使用-groups-命令"><a href="#使用-groups-命令" class="headerlink" title="使用 groups 命令"></a>使用 groups 命令</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">groups 【用户名】</span><br></pre></td></tr></table></figure>

<p>直接输入<code>groups</code>也可，这时候系统默认会找到当前用户的用户组。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015132944.png" alt="image-20211015132942768"></p>
<p>其中冒号之前表示用户，后面表示该用户所属的用户组。这里可以看到 shiyanlou 用户属于 shiyanlou 用户组，每次新建用户如果不指定用户组的话，默认会自动创建一个与用户名相同的用户组（差不多就相当于家长的意思）。</p>
<h4 id="查看-etc-group文件"><a href="#查看-etc-group文件" class="headerlink" title="查看/etc/group文件"></a>查看<code>/etc/group</code>文件</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /etc/group</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015133244.png" alt="image-20211015133242639"></p>
<p>这会输出所有的用户组信息。我们可以使用<code>grep</code>命令对结果进行过滤。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cat /etc/group | grep &#x27;【用户名】&#x27;</span><br><span class="line">如：</span><br><span class="line">cat /etc/group | grep &#x27;marshio&#x27;</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211015133629.png" alt="image-20211015133628470"></p>
<p><code>/etc/group</code> 文件的内容包括用户组（Group）、用户组口令（密码）、GID（组 ID） 及该用户组所包含的用户（User），每个用户组一条记录。格式如下：</p>
<blockquote>
<p>Group_Name : password : GID : [user_list]</p>
</blockquote>
<p>你看到上面的 password 字段为一个 <code>x</code>，并不是说密码就是它，只是表示密码不可见而已。</p>
<p>这里需要==注意==，如果用户的 GID 等于用户组的 GID，那么最后一个字段 <code>user_list</code> 就是空的，这里的 GID 是指用户默认所在组的 GID，可以使用 <code>id</code> 命令查看。</p>
<p>比如:</p>
<p> <code>shiyanlou</code> 用户，在 <code>/etc/group</code> 中的 <code>shiyanlou </code>用户组后面是不会显示<code>shiyanlou</code>的。</p>
<p><code>marshio</code> 用户，在 <code>/etc/group</code> 中的 <code>marshio </code>用户组后面是不会显示<code>marshio</code>的。</p>
<h4 id="加入用户组"><a href="#加入用户组" class="headerlink" title="加入用户组"></a>加入用户组</h4><p>默认情况下新创建的用户是不具有 root 权限的，也不在 <code>sudo </code>用户组，可以让其加入 <code>sudo </code>用户组从而获取 root 权限：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo usermod -G sudo 【用户名】</span><br><span class="line">例</span><br><span class="line">sudo usermod -G sudo marshio</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018131621.png" alt="image-20211018131620844"></p>
<p>使用此命令的前提是当前用户在<code>sudo</code>用户组里。</p>
<p>此时我们使用<code>cat /etc/group | grep &#39;sudo&#39;</code>可以查看<code>sudo</code>用户组都有哪些用户。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018131932.png" alt="image-20211018131930196"></p>
<h4 id="删除用户和用户组"><a href="#删除用户和用户组" class="headerlink" title="删除用户和用户组"></a>删除用户和用户组</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo deluser 【用户名】  只删除用户</span><br><span class="line">sudo deluser 【用户名】  删除用户的同时删除其对应的文件</span><br></pre></td></tr></table></figure>

<p>使用 <code>--remove-home</code> 参数在删除用户时候会一并将该用户的工作目录一并删除。如果不使用那么系统会自动在 /home 目录为该用户保留工作目录。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018132932.png" alt="image-20211018132931746"></p>
<p>此时，文件<code>ms</code>还存在.</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018133042.png" alt="image-20211018133041180"></p>
<p>此时文件<code>ms</code>已经不存在了。</p>
<p>删除用户的同时会删除用户组，前提是该用户组只存在这么一个用户。即用户组为空时会自动被删除。</p>
<p>当然删除用户组也可以使用如下命令。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo delgroup 【用户组名称】  </span><br><span class="line">sudo groupdel 【用户组名称】</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211018133503.png" alt="image-20211018133502112"></p>
<p>我这里新建了一个叫<code>ms</code>的用户组，然后将其删除。可以看出这两种删除的不同之处在于第二种不会输出信息。删除用户组的前提是用户组中不含有用户。</p>
<hr>
<h2 id="Linux文件管理"><a href="#Linux文件管理" class="headerlink" title="Linux文件管理"></a>Linux文件管理</h2><p>文件权限就是文件的访问控制权限，即哪些用户和组群可以访问文件以及可以执行什么样的操作。</p>
<p>Unix/Linux 系统是一个典型的多用户系统，不同的用户处于不同的地位，对文件和目录有不同的访问权限。为了保护系统的安全性，Unix/Linux 系统除了对用户权限作了严格的界定外，还在用户身份认证、访问控制、传输安全、文件读写权限等方面作了周密的控制。</p>
<p>在 Unix/Linux 中的每一个文件或目录都包含有访问权限，这些访问权限决定了谁能访问和如何访问这些文件和目录。</p>
<h3 id="基本文件操作"><a href="#基本文件操作" class="headerlink" title="基本文件操作"></a>基本文件操作</h3><p>文件常用的基本操作，包括：新建、复制、删除、移动文件与文件重命名、查看文件、查看文件类型、以及编辑文件。</p>
<h4 id="新建"><a href="#新建" class="headerlink" title="新建"></a>新建</h4><h5 id="新建文件"><a href="#新建文件" class="headerlink" title="新建文件"></a>新建文件</h5><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">touch 【文件名】</span><br><span class="line">例</span><br><span class="line">touch marshio</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019131135.png" alt="image-20211019131134676"></p>
<p>使用 <code>touch</code> 命令创建空白文件，关于 <code>touch</code> 命令，其主要作用是来<strong>更改已有文件的时间戳</strong>的（比如，最近访问时间，最近修改时间），但其在不加任何参数的情况下，只指定一个文件名，则可以创建一个指定文件名的空白文件（不会覆盖已有同名文件），当然你也可以同时指定该文件的时间戳，更多关于 <code>touch</code> 命令的用法，会在下一讲文件搜索中涉及。</p>
<h5 id="新建目录"><a href="#新建目录" class="headerlink" title="新建目录"></a>新建目录</h5><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mkdir 【目录名】</span><br><span class="line">例</span><br><span class="line">mkdir syl</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020132329.png" alt="image-20211020132327928"></p>
<p>使用 <code>mkdir</code>（make directories）命令可以创建一个空目录，也可同时指定创建目录的权限属性。</p>
<p>使用 <code>-p</code> 参数，同时创建父目录（如果不存在该父目录），如下我们同时创建一个多级目录（这在安装软件、配置安装路径时非常有用）。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p 【父级目录】/【子级目录1】/【子级目录2】/【。。。】</span><br><span class="line">例</span><br><span class="line">mkdir -p fa/son1/son2/son3</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020132739.png" alt="image-20211020132737948"></p>
<p>还有一点需要注意的是，若当前目录已经创建了一个 <code>test </code>文件/目录，再使用 <code>mkdir test</code> 新建同名的文件夹，系统会报错文件已存在。这符合 Linux 一切皆文件的理念。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020132930.png" alt="image-20211020132928783"></p>
<p>若当前目录存在一个 test 文件夹，则 <code>touch</code> 命令，则会更改该文件夹的时间戳而不是新建文件。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020133031.png" alt="image-20211020133029921"></p>
<h4 id="复制"><a href="#复制" class="headerlink" title="复制"></a>复制</h4><h5 id="复制文件"><a href="#复制文件" class="headerlink" title="复制文件"></a>复制文件</h5><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">cp 【文件名】 &#123;【指定目录路径】。。。&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash">例</span></span><br><span class="line">cp test fa/son1/son2 #将test复制到son2目录下</span><br><span class="line"><span class="meta">#</span><span class="bash">当想复制非本目录下的文件时，需要用绝对路径或相对路径来表示</span></span><br><span class="line"><span class="meta">#</span><span class="bash">例</span></span><br><span class="line">cp fa/son1/son2/test fa/son1/son2/son3</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020133637.png" alt="image-20211020133636307"></p>
<h5 id="复制目录"><a href="#复制目录" class="headerlink" title="复制目录"></a>复制目录</h5><p>如果直接使用 <code>cp</code> 命令复制一个目录的话，会出现如下错误：<code>cp ：略过目录‘’</code></p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020133901.png" alt="image-20211020133900285"></p>
<p>像我们在创建目录的时候都加入了一个参数来标识这是个目录了，那么在移动的时候我们也需要用一个标识来表示这是个目录。那这个标识还是<code>-p</code>嘛？，当然不是啦，要成功复制目录需要加上 <code>-r</code> 或者 <code>-R</code> 参数，表示递归复制，就是说有点“株连九族”的意思。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020134331.png" alt="image-20211020134329793"></p>
<h4 id="删除"><a href="#删除" class="headerlink" title="删除"></a>删除</h4><h5 id="删除文件"><a href="#删除文件" class="headerlink" title="删除文件"></a>删除文件</h5><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">rm 【文件名】</span><br><span class="line">例</span><br><span class="line">rm test</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020192728820.png" alt="image-20211020192728820"></p>
<p>当我们删除一些制度文件时，就会有提示信息，如</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo chmod 444 test #给test文件只读的权限</span><br><span class="line">ls -l #显示文件的详细信息</span><br><span class="line">rm test #执行完此命令会提示，是否删除有写保护的普通空文件？此时我们输入“y”</span><br><span class="line">ls -l #再次执行显示文件的详细信息</span><br></pre></td></tr></table></figure>



<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020193104297.png" alt="image-20211020193104297"></p>
<p>如果我们不想让他提示，强制删除，此时我们只需要加入一个参数<code>-r</code>，这就是当时掀起一番波浪的<code>rm -rf /*</code>删库跑路事件。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020194312944.png" alt="image-20211020194312944"></p>
<p>此时就没有提示来阻碍我们删库跑路了，但是，当我们遇到想要删除的目录会咋办呢？根据上面的经验，那一定是要加一个参数的。这个参数会不会跟上面相同呢？</p>
<p>我们来试一下。</p>
<h5 id="删除目录"><a href="#删除目录" class="headerlink" title="删除目录"></a>删除目录</h5><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rm -p/-r 【目录名称】</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020194706230.png" alt="image-20211020194706230"></p>
<p>我们可以看到，执行成功了。</p>
<p>所以你已经学会如何删库跑路了，你离大佬已经非常近了。</p>
<h4 id="移动文件"><a href="#移动文件" class="headerlink" title="移动文件"></a>移动文件</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mv 【文件名】 【所要移动的目录的路径】</span><br><span class="line"><span class="meta">#</span><span class="bash">例</span></span><br><span class="line">mv test to/here #这里报错是因为我没创建test，之前被删掉了</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020200745864.png" alt="image-20211020200745864"></p>
<p><img src="C:\Users\Mashuo\AppData\Roaming\Typora\typora-user-images\image-20211020200926733.png" alt="image-20211020200926733"></p>
<h4 id="重命名"><a href="#重命名" class="headerlink" title="重命名"></a>重命名</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mv 【old】 【new】</span><br><span class="line">例</span><br><span class="line">mv test test1</span><br></pre></td></tr></table></figure>

<p><code>mv </code>命令除了被当作移动文件的命令之外，还有重命名的功能。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020201235369.png" alt="image-20211020201235369"></p>
<h3 id="查看文件外部信息"><a href="#查看文件外部信息" class="headerlink" title="查看文件外部信息"></a>查看文件外部信息</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">ls #只显示文件名</span><br><span class="line">ls -l #显示较长得文件信息，文件信息显示得较全</span><br><span class="line">ls -a #显示所有文件，包括隐藏文件，Linux中以.开头的为隐藏文件</span><br><span class="line">ls -asSh #显示所有文件得大小，并以我们能看懂的方式展示出来</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019123639.png" alt="image-20211019123638517"></p>
<p>我们来详细看一下<code>ls -l</code>显示的信息</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019123804.png" alt="image-20211019123802880"></p>
<p>这个输出的构成是一个什么格式呢？</p>
<p>就是以下格式啦。</p>
<p><img src="https://doc.shiyanlou.com/linux_base/3-9.png" alt="img"></p>
<ul>
<li><p>第一串字母：文件类型及权限，第一个字母代表的是文件类型，剩下代表文件分配权限，具体如下</p>
<ul>
<li>文件类型：<ul>
<li>在Linux中，==一切皆文件==，这是我们需要时刻谨记的。正因为这一点才有了设备文件（ <code>/dev</code> 目录下有各种设备文件，大都跟具体的硬件设备相关）这一说。 <code>socket</code>：网络套接字，具体是什么，感兴趣的用户可以去学习实验楼的后续相关课程。<code>pipe</code> 管道，这个东西很重要，我们以后将会讨论到，这里你先知道有它的存在即可。<code>软链接文件</code>：链接文件是分为两种的，另一种当然是“硬链接”（硬链接不常用，具体内容不作为本课程讨论重点，而软链接等同于 Windows 上的快捷方式，你记住这一点就够了）</li>
</ul>
</li>
<li>权限<ul>
<li>读权限，表示你可以使用 <code>cat &lt;file name&gt;</code> 之类的命令来读取某个文件的内容；</li>
<li>写权限，表示你可以编辑和修改某个文件的内容；</li>
<li>执行权限，通常指可以运行的二进制程序文件或者脚本文件，如同 Windows 上的 <code>exe</code> 后缀的文件，不过 Linux 上不是通过文件后缀名来区分文件的类型。你需要注意的一点是，<strong>一个目录同时具有读权限和执行权限才可以打开并查看内部文件，而一个目录要有写权限才允许在其中创建其它文件</strong>，这是因为目录文件实际保存着该目录里面的文件的列表等信息。</li>
</ul>
</li>
</ul>
<p>  <img src="https://doc.shiyanlou.com/linux_base/3-10.png" alt="pic"></p>
</li>
</ul>
<p>在这里我们大多时候只需要注意第一个权限即可，即拥有者权限</p>
<ul>
<li><p>链接数：链接到该文件所在的 <code>inode </code>结点的文件名数目（关于这个概念涉及到 Linux 文件系统的相关概念知识，感兴趣的可以查看 <a target="_blank" rel="noopener" href="https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html#major2">硬链接和软链接的联系与区别</a>）。这里涉及到了树得知识，建议先去搞懂树的结构以及构建再看，工欲善其事必先利其器。</p>
</li>
<li><p>文件大小：以 <code>inode </code>结点大小为单位来表示的文件大小，你可以使用<code> ls -lh</code>  来更直观的查看文件的大小。</p>
</li>
</ul>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls -a</span><br></pre></td></tr></table></figure>

<ul>
<li><p>显示所有文件，包括隐藏文件和当前目录以及上一级目录</p>
<p>  <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019130130.png" alt="image-20211019130127163"></p>
</li>
</ul>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls -dl 【目录名】</span><br></pre></td></tr></table></figure>

<ul>
<li><p>显示某一目录的完整属性，而不是内部文件的信息</p>
<p>  <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019130533.png" alt="image-20211019130455526"></p>
</li>
<li><p>不写目录名默认当前目录</p>
<p>  <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019130528.png" alt="image-20211019130527090"></p>
</li>
</ul>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls -asSh</span><br></pre></td></tr></table></figure>

<ul>
<li>显示所有文件大小，其中小s为显示文件大小，大S为按文件大小排序，也可单独使用</li>
</ul>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020201401458.png" alt="image-20211020201401458"></p>
<p>这都是查看文件的信息，如果我想查看文件内部的信息，该使用什么命令呢？</p>
<h3 id="查看文件内部信息"><a href="#查看文件内部信息" class="headerlink" title="查看文件内部信息"></a>查看文件内部信息</h3><h4 id="使用-cat，tac-和-nl-命令查看文件"><a href="#使用-cat，tac-和-nl-命令查看文件" class="headerlink" title="使用 cat，tac 和 nl 命令查看文件"></a>使用 <code>cat</code>，<code>tac</code> 和 <code>nl</code> 命令查看文件</h4><p>前两个命令都是用来打印文件内容到标准输出（终端），其中 <code>cat</code> 为正序显示，<code>tac</code> 为倒序显示。</p>
<blockquote>
<p>标准输入输出：当我们执行一个 shell 命令行时通常会自动打开三个标准文件，即标准输入文件（stdin），默认对应终端的键盘、标准输出文件（stdout）和标准错误输出文件（stderr），后两个文件都对应被重定向到终端的屏幕，以便我们能直接看到输出内容。进程将从标准输入文件中得到输入数据，将正常输出数据输出到标准输出文件，而将错误信息送到标准错误文件中。</p>
</blockquote>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cat 【文件名】</span><br><span class="line">cat -n 【文件名】 #显示行号</span><br></pre></td></tr></table></figure>



<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020205703891.png" alt="image-20211020205703891"></p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020210632645.png" alt="image-20211020210632645"></p>
<p><code>nl</code> 命令，添加行号并打印，这是个比 <code>cat -n</code> 更专业的行号打印命令。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nl 【文件名】</span><br></pre></td></tr></table></figure>

<p>这里简单列举它的常用的几个参数：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">-b : 指定添加行号的方式，主要有两种：</span><br><span class="line">    -b a:表示无论是否为空行，同样列出行号(<span class="string">&quot;cat -n&quot;</span>就是这种方式)</span><br><span class="line">    -b t:只列出非空行的编号并列出（默认为这种方式）</span><br><span class="line">-n : 设置行号的样式，主要有三种：</span><br><span class="line">    -n ln:在行号字段最左端显示</span><br><span class="line">    -n rn:在行号字段最右边显示，且不加 0</span><br><span class="line">    -n rz:在行号字段最右边显示，且加 0</span><br><span class="line">-w : 行号字段占用的位数(默认为 6 位)</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020210737333.png" alt="image-20211020210737333"></p>
<p>此处我切换到了自己的虚拟机，实验楼的虚拟机让我搞坏了。。。。。（下面请看，我的作死过程）</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020205812075.png" alt="image-20211020205812075"></p>
<p>就这样，我被Linux忘记了。。。。问题就出在我使用了<code>mv /etc/passwd /</code>，好死不死的我还用了<code>sudo</code> ,这下彻底没救了，当然也不是，方法还是有的，需要重启，这样的话，喊话：实验楼能不能帮我重启一下啊。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020210059963.png" alt="image-20211020210059963"></p>
<p>好了，这也算是重启吧。</p>
<p>切回正题，使用<code>cat</code>命令查看文件内的内容，我们已经演示了。</p>
<p>下面使用<code>tac</code>命令，</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020210439380.png" alt="image-20211020210439380"></p>
<p>因为是倒叙，所以我特意截了一点上面的。嗯，是倒叙的。</p>
<p>你会发现使用这几个命令，默认的终端窗口大小，一屏显示不完文本的内容，得用鼠标拖动滚动条或者滑动滚轮才能继续往下翻页，要是可以直接使用键盘操作翻页就好了，那么你就可以使用下面要介绍的命令。</p>
<h4 id="使用-more-和-less-命令分页查看文件"><a href="#使用-more-和-less-命令分页查看文件" class="headerlink" title="使用 more 和 less 命令分页查看文件"></a>使用 <code>more</code> 和 <code>less</code> 命令分页查看文件</h4><p>如果说上面的 <code>cat</code> 是用来快速查看一个文件的内容的，那么这个 <code>more</code> 和 <code>less</code> 就是天生用来”阅读”一个文件的内容的，比如说 man 手册内部就是使用的 <code>less</code> 来显示内容。其中 <code>more</code> 命令比较简单，只能向一个方向滚动，而 <code>less</code> 为基于 <code>more</code> 和 <code>vi</code> （一个强大的编辑器，我们有单独的课程来让你学习）开发，功能更强大。<code>less</code> 的使用基本和 <code>more</code> 一致，具体使用请查看 man 手册，这里只介绍 <code>more</code> 命令的使用。</p>
<p>使用 <code>more</code> 命令打开 <code>passwd</code> 文件：</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020214128698.png" alt="image-20211020214128698"></p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020214025621.png" alt="image-20211020214025621"></p>
<p>此时著需要按一下 ↓ 即可。</p>
<h4 id="使用-head-和-tail-命令查看文件"><a href="#使用-head-和-tail-命令查看文件" class="headerlink" title="使用 head 和 tail 命令查看文件"></a>使用 <code>head</code> 和 <code>tail</code> 命令查看文件</h4><p>这两个命令，那些性子比较急的人应该会喜欢，因为它们一个是只查看文件的头几行（默认为 10 行，不足 10 行则显示全部）和尾几行。还是拿 <code>passwd </code>文件举例，比如当我们想要查看最近新增加的用户，那么我们可以查看这个 <code>/etc/passwd</code> 文件，不过我们前面也看到了，这个文件里面一大堆乱糟糟的东西，看起来实在费神啊。因为系统新增加一个用户，会将用户的信息添加到 <code>passwd</code>文件的最后，那么这时候我们就可以使用 <code>tail</code> 命令了：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tail 【文件名】</span><br></pre></td></tr></table></figure>

<p>还可以限制行数，只需要加上<code>-n 【行数】</code>，如</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tail -n 【行数】 【文件名】</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020225250271.png" alt="image-20211020225250271"></p>
<p>关于 <code>tail</code> 命令，不得不提的还有它一个很牛的参数 <code>-f</code>，这个参数可以实现不停地读取某个文件的内容并显示。这可以让我们动态查看日志，达到实时监视的目的。不过我不会在这门基础课程中介绍它的更多细节，感兴趣的用户可以自己去了解。</p>
<h3 id="查看文件类型"><a href="#查看文件类型" class="headerlink" title="查看文件类型"></a>查看文件类型</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">file 【文件名】</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211020225617805.png" alt="image-20211020225617805"></p>
<p>在 Linux 中文件的类型不是根据文件后缀来判断的。</p>
<h3 id="编辑文件"><a href="#编辑文件" class="headerlink" title="编辑文件"></a>编辑文件</h3><p>在 Linux 下面编辑文件通常我们会直接使用专门的命令行编辑器比如（emacs，vim，Nano），由于涉及 Linux 上的编辑器的内容比较多，且非常重要，故我们有一门单独的基础课专门介绍这中一个编辑器 <strong>vim</strong> 。</p>
<p> <a target="_blank" rel="noopener" href="https://www.lanqiao.cn/courses/2">vim 编辑器 –学习传送门</a></p>
<p>也可直接使用 Linux 内部的 vim 学习教程，输入如下命令即可开始：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vimtutor</span><br></pre></td></tr></table></figure>

<p>如果提示你还没安装vim的话，可以使用命令<code>sudo apt-get install vim </code>进行下载。</p>
<p>至于文件的详细编辑使用可以参照下面的[vim编辑器](# vim编辑器)。</p>
<h3 id="修改文件所有者"><a href="#修改文件所有者" class="headerlink" title="修改文件所有者"></a>修改文件所有者</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo chown 【用户名】 【文件名】</span><br><span class="line">例</span><br><span class="line">sudo chown shiyanlou marshio </span><br><span class="line"><span class="meta">#</span><span class="bash">表示将marshio这个文件的拥有者改成shiyanlou</span></span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019132021.png" alt="image-20211019132019299"></p>
<p>以上显示我使用<code>marshio</code>用户的身份创建了一个名叫<code>marshio</code>的文件，我回到<code>shiyanlou</code>用户，查看文件，发现文件的所有者是<code>marshio</code>，如果我想更改文件所有者，该是用什么命令呢？</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019132529.png" alt="image-20211019132527352"></p>
<h3 id="修改文件权限"><a href="#修改文件权限" class="headerlink" title="修改文件权限"></a>修改文件权限</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod 【二进制权限】 【文件名】</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019133205.png" alt="image-20211019133204295"></p>
<p>修改文件权限有两种方式</p>
<ul>
<li><p>二进制数字表示</p>
<p>  <img src="https://doc.shiyanlou.com/linux_base/3-14.png" alt="img"></p>
</li>
</ul>
<p>看到这个图片相信你已经明白了不少了，</p>
<p>每个文件有三组固定的权限，分别对应<strong>拥有者</strong>，<strong>所属用户组</strong>，<strong>其他用户</strong>，<strong>记住这个顺序是固定的</strong>。文件的读写执行对应字母 <code>rwx</code>，以二进制表示就是 <code>111</code>，用十进制表示就是 <code>7</code>，对进制转换不熟悉的同学可以看看 <a target="_blank" rel="noopener" href="https://baike.baidu.com/item/%E8%BF%9B%E5%88%B6%E8%BD%AC%E6%8D%A2/3117222">进制转换</a>。例如我们刚刚新建的文件 <code>marshio</code>的权限是 <code>rw-rw-r--</code>，换成对应的十进制表示就是 665，这就表示这个文件的拥有者，所属用户组具有读写权限，其他用户只有读权限，没有写权限，并且他们都不具有执行权限。</p>
<p>那么使用什么命令去执行呢？</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019133205.png"></p>
<p><code>777</code>这个权限代表的就是全用户拥有这个文件的全功能权限。</p>
<ul>
<li><p>加减赋值操作</p>
  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">chmod 【gou】【-/+】【rwx】 【文件名】</span><br><span class="line">例</span><br><span class="line">chmod go-rw marshio</span><br></pre></td></tr></table></figure>

<p>  <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211019133543.png" alt="image-20211019133542357"></p>
</li>
</ul>
<p><code>g</code>、<code>o</code> 还有 <code>u</code> 分别表示 group（用户组）、others（其他用户） 和 user（用户），<code>+</code> 和 <code>-</code> 分别表示增加和去掉相应的权限。</p>
<h3 id="搜索文件"><a href="#搜索文件" class="headerlink" title="搜索文件"></a>搜索文件</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">whereis </span><br><span class="line">which </span><br><span class="line">find</span><br><span class="line">locate</span><br></pre></td></tr></table></figure>

<h4 id="whereis"><a href="#whereis" class="headerlink" title="whereis"></a>whereis</h4><p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211024215745065.png" alt="image-20211024215745065"></p>
<blockquote>
<p>直接从数据库中查询，简单快捷，<code>whereis</code> 只能搜索二进制文件（<code>-b</code>），man 帮助文件（<code>-m</code>）和源代码文件（<code>-s</code>）。如果想要获得更全面的搜索结果可以使用 <code>locate</code> 命令。</p>
</blockquote>
<h4 id="locate"><a href="#locate" class="headerlink" title="locate"></a>locate</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 这个需要提前安装</span></span><br><span class="line">sudo apt-get install locate # 下载locate</span><br><span class="line">sudo apt-get update #更新</span><br><span class="line">sudo updatedb #更新locate的数据库</span><br><span class="line"></span><br><span class="line">locate 【文件名】</span><br></pre></td></tr></table></figure>

<p>快而全</p>
<blockquote>
<p>使用 <code>locate</code> 命令查找文件也不会遍历硬盘，它通过查询 <code>/var/lib/mlocate/mlocate.db</code> 数据库来检索信息。不过这个数据库也不是实时更新的，系统会使用定时任务每天自动执行 <code>updatedb</code> 命令来更新数据库。所以有时候你刚添加的文件，它可能会找不到，需要手动执行一次 <code>updatedb</code> 命令（在我们的环境中必须先执行一次该命令）。注意这个命令也不是内置的命令，在部分环境中需要手动安装，然后执行更新。</p>
</blockquote>
<p>它可以用来查找指定目录下的不同文件类型，如查找 <code>/etc</code> 下所有以 <code>sh </code>开头的文件</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">locate /etc/sh</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211024220513989.png" alt="image-20211024220513989"></p>
<p><strong>注意，它不只是在<code> /etc</code> 目录下查找，还会自动递归子目录进行查找。</strong></p>
<p>如果想只统计数目可以加上 <code>-c</code> 参数，<code>-i</code> 参数可以忽略大小写进行查找，<code>whereis</code> 的 <code>-b</code>、<code>-m</code>、<code>-s</code> 同样可以使用。</p>
<h4 id="which"><a href="#which" class="headerlink" title="which"></a>which</h4><p><code>which</code> 本身是 Shell 内建的一个命令，我们通常使用 <code>which</code> 来确定是否安装了某个指定的程序，因为它只从 <code>PATH</code> 环境变量指定的路径中去搜索命令并且返回第一个搜索到的结果。也就是说，我们可以看到某个系统命令是否存在以及执行的到底是哪一个地方的命令。</p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211024220751744.png" alt="image-20211024220751744"></p>
<h4 id="find"><a href="#find" class="headerlink" title="find"></a>find</h4><p><code>find</code> 应该是这几个命令中最强大的了，它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性（如文件的时间戳，文件的权限等）进行搜索。<code>find</code> 命令强大到，要把它讲明白至少需要单独好几节课程才行，我们这里只介绍一些常用的内容。</p>
<p>这条命令表示去 <code>/etc/</code> 目录下面 ，搜索名字叫做 interfaces 的文件或者目录。这是 <code>find</code> 命令最常见的格式，千万记住 <code>find</code> 的第一个参数是要搜索的地方。命令前面加上 <code>sudo</code> 是因为只是普通用户，对 <code>/etc</code> 目录下的很多文件都没有访问的权限，如果是 root 用户则不用使用。</p>
<blockquote>
<p><strong>注意 find 命令的路径是作为第一个参数的， 基本命令格式为 find [path][option] [action] 。</strong></p>
</blockquote>
<p>与时间相关的命令参数：</p>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>-atime</code></td>
<td>最后访问时间</td>
</tr>
<tr>
<td><code>-ctime</code></td>
<td>最后修改文件内容的时间</td>
</tr>
<tr>
<td><code>-mtime</code></td>
<td>最后修改文件属性的时间</td>
</tr>
</tbody></table>
<p>下面以 <code>-mtime</code> 参数举例：</p>
<ul>
<li><code>-mtime n</code>：n 为数字，表示为在 n 天之前的“一天之内”修改过的文件</li>
<li><code>-mtime +n</code>：列出在 n 天之前（不包含 n 天本身）被修改过的文件</li>
<li><code>-mtime -n</code>：列出在 n 天之内（包含 n 天本身）被修改过的文件</li>
<li><code>-newer file</code>：file 为一个已存在的文件，列出比 file 还要新的文件名</li>
</ul>
<p><img src="https://doc.shiyanlou.com/linux_base/5-8.png" alt="1"></p>
<p>列出 home 目录中，当天（24 小时之内）有改动的文件</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">find ~ -mtime 0</span><br></pre></td></tr></table></figure>

<h3 id="压缩与打包"><a href="#压缩与打包" class="headerlink" title="压缩与打包"></a>压缩与打包</h3><p> Linux 上常用的压缩/解压工具，主要为 zip，tar 的使用。</p>
<p>在讲 Linux 上的压缩工具之前，有必要先了解一下常见常用的压缩包文件格式。在 Windows 上最常见的不外乎这两种 <code>*.zip</code>，<code>*.7z</code> 后缀的压缩文件。而在 Linux 上面常见的格式除了以上两种外，还有 <code>.rar</code>，<code>*.gz</code>，<code>*.xz</code>，<code>*.bz2</code>，<code>*.tar</code>，<code>*.tar.gz</code>，<code>*.tar.xz</code>，<code>*.tar.bz2</code>，简单介绍如下：</p>
<table>
<thead>
<tr>
<th>文件后缀名</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>*.zip</code></td>
<td>zip 程序打包压缩的文件</td>
</tr>
<tr>
<td><code>*.rar</code></td>
<td>rar 程序压缩的文件</td>
</tr>
<tr>
<td><code>*.7z</code></td>
<td>7zip 程序压缩的文件</td>
</tr>
<tr>
<td><code>*.tar</code></td>
<td>tar 程序打包，未压缩的文件</td>
</tr>
<tr>
<td><code>*.gz</code></td>
<td>gzip 程序（GNU zip）压缩的文件</td>
</tr>
<tr>
<td><code>*.xz</code></td>
<td>xz 程序压缩的文件</td>
</tr>
<tr>
<td><code>*.bz2</code></td>
<td>bzip2 程序压缩的文件</td>
</tr>
<tr>
<td><code>*.tar.gz</code></td>
<td>tar 打包，gzip 程序压缩的文件</td>
</tr>
<tr>
<td><code>*.tar.xz</code></td>
<td>tar 打包，xz 程序压缩的文件</td>
</tr>
<tr>
<td><code>*tar.bz2</code></td>
<td>tar 打包，bzip2 程序压缩的文件</td>
</tr>
<tr>
<td><code>*.tar.7z</code></td>
<td>tar 打包，7z 程序压缩的文件</td>
</tr>
</tbody></table>
<p>讲了这么多种压缩文件，这么多个命令，不过我们一般只需要掌握几个命令即可，包括 <code>zip</code>，<code>tar</code>。下面会依次介绍这几个命令及对应的解压命令。</p>
<h3 id="扩展"><a href="#扩展" class="headerlink" title="扩展"></a>扩展</h3><h4 id="adduser-和-useradd-的区别是什么"><a href="#adduser-和-useradd-的区别是什么" class="headerlink" title="adduser 和 useradd 的区别是什么"></a><code>adduser</code> 和 <code>useradd</code> 的区别是什么</h4><p>答：<code>useradd</code> 只创建用户，不会创建用户密码和工作目录，创建完了需要使用 <code>passwd &lt;username&gt;</code> 去设置新用户的密码。<code>adduser</code> 在创建用户的同时，会创建工作目录和密码（提示你设置），做这一系列的操作。其实 <code>useradd</code>、<code>userdel</code> 这类操作更像是一种命令，执行完了就返回。而 <code>adduser</code> 更像是一种程序，需要你输入、确定等一系列操作。</p>
<p>Linux 还有一些关于隐藏权限和特殊权限的内容，想全面了解 Linux 权限管理这部分内容的用户可以通过其它方式学习。</p>
<hr>
<h2 id="Linux目录结构"><a href="#Linux目录结构" class="headerlink" title="Linux目录结构"></a>Linux目录结构</h2><p>包括</p>
<ol>
<li>Linux 的文件组织目录结构。</li>
<li>相对路径和绝对路径。</li>
<li>对文件的移动、复制、重命名、编辑等操作。</li>
</ol>
<h3 id="Linux目录结构-1"><a href="#Linux目录结构-1" class="headerlink" title="Linux目录结构"></a>Linux目录结构</h3><p>在讲 Linux 目录结构之前，你首先要清楚一点，那就是 Linux 的目录与 Windows 的目录的区别，或许对于一般操作上的感受来说没有多大不同，但从它们的实现机制来说是完全不同的。</p>
<p>一种不同是体现在目录与存储介质（磁盘，内存，DVD 等）的关系上，以往的 Windows 一直是以存储介质为主的，主要以盘符（C 盘，D 盘…）及分区来实现文件管理，然后之下才是目录，目录就显得不是那么重要，除系统文件之外的用户文件放在任何地方任何目录也是没有多大关系。所以通常 Windows 在使用一段时间后，磁盘上面的文件目录会显得杂乱无章（少数善于整理的用户除外吧）。然而 UNIX/Linux 恰好相反，UNIX 是以目录为主的，Linux 也继承了这一优良特性。 Linux 是以树形目录结构的形式来构建整个系统的，可以理解为树形目录是一个用户可操作系统的骨架。虽然本质上无论是目录结构还是操作系统内核都是存储在磁盘上的，但从逻辑上来说 Linux 的磁盘是“挂在”（挂载在）目录上的，每一个目录不仅能使用本地磁盘分区的文件系统，也可以使用网络上的文件系统。举例来说，可以利用网络文件系统（Network File System，NFS）服务器载入某特定目录等。</p>
<h3 id="FHS标准"><a href="#FHS标准" class="headerlink" title="FHS标准"></a>FHS标准</h3><p>Linux 的目录结构说复杂很复杂，说简单也很简单。复杂在于，因为系统的正常运行是以目录结构为基础的，对于初学者来说里面大部分目录都不知道其作用，重要与否，特别对于那些曾经的重度 Windows 用户，他们会纠结很长时间，关于我安装的软件在哪里这类问题。说它简单是因为，其中大部分目录结构是规定好了的（FHS 标准），是死的，当你掌握后，你在里面的一切操作都会变得井然有序。</p>
<blockquote>
<p>FHS（英文：Filesystem Hierarchy Standard 中文：文件系统层次结构标准），多数 Linux 版本采用这种文件组织形式，FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。</p>
</blockquote>
<p>FHS 定义了两层规范，第一层是， <code>/</code> 下面的各个目录应该要放什么文件数据，例如 <code>/etc</code> 应该放置设置文件，<code>/bin</code> 与 <code>/sbin</code> 则应该放置可执行文件等等。</p>
<p>第二层则是针对 <code>/usr</code> 及 <code>/var</code> 这两个目录的子目录来定义。例如 <code>/var/log</code> 放置系统日志文件，<code>/usr/share</code> 放置共享数据等等。</p>
<p><a target="_blank" rel="noopener" href="https://refspecs.linuxfoundation.org/FHS_3.0/fhs-3.0.pdf">FHS_3.0 标准文档</a></p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20210930174255.png" alt="LinuxFileSystemStructureMap"></p>
<p>如果你觉得看这个不明白，那么可以试试最真实最直观的方式，执行如下命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tree /</span><br></pre></td></tr></table></figure>

<p>如果提示” command not found “，就先安装：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 因为环境的原因，每次新启动实验会清除系统恢复到初始状态，所以需要手动更新软件包索引，以便我们安装时能找到相应软件包的源。</span></span><br><span class="line"></span><br><span class="line">sudo apt-get update</span><br><span class="line"></span><br><span class="line">sudo apt-get install tree</span><br></pre></td></tr></table></figure>

<p>关于上面提到的 FHS，这里还有个很重要的内容你一定要明白，FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的，并且会维持更新，FHS 依据文件系统使用的频繁与否以及是否允许用户随意改动（注意，不是不能，学习过程中，不要怕这些），将目录定义为四种交互作用的形态，如下表所示：</p>
<p><img src="https://doc.shiyanlou.com/document-uid18510labid59timestamp1482919171956.png" alt="1"></p>
<h3 id="目录路径"><a href="#目录路径" class="headerlink" title="目录路径"></a>目录路径</h3><h4 id="路径"><a href="#路径" class="headerlink" title="路径"></a>路径</h4><blockquote>
<p>路径，大白话，就是从A到B的“路线”，对于文件来说，就是进入一个文件所需要经历的路径。</p>
</blockquote>
<p>切换路径我们都使用<code>cd </code>命令，如切换到上级目录命令<code>cd ..</code>，进入自己的<code>home</code>目录</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd ~ #在Linux中，~代表当前登录用户的目录，即/home/【用户名】</span><br></pre></td></tr></table></figure>

<h5 id="获取当前路径"><a href="#获取当前路径" class="headerlink" title="获取当前路径"></a>获取当前路径</h5><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pwd #可以使用pwd获取当前路径</span><br></pre></td></tr></table></figure>

<h4 id="绝对路径"><a href="#绝对路径" class="headerlink" title="绝对路径"></a>绝对路径</h4><p>关于<strong>绝对路径</strong>，简单地说就是以根” / “目录为起点的完整路径，以你所要到的目录为终点，表现形式如： <code>/usr/local/bin</code>，表示根目录下的 <code>usr</code> 目录中的 <code>local</code> 目录中的 <code>bin</code> 目录。</p>
<h4 id="相对路径"><a href="#相对路径" class="headerlink" title="相对路径"></a>相对路径</h4><p>相对路径，也就是相对于你当前的目录的路径，相对路径是以当前目录 <code>.</code> 为起点，以你所要到的目录为终点，表现形式如： <code>usr/local/bin</code> （这里假设你当前目录为根目录）。你可能注意到，我们表示相对路径实际并没有加上表示当前目录的那个 <code>.</code> ，而是直接以目录名开头，因为这个 <code>usr</code> 目录为 <code>/</code> 目录下的子目录，是可以省略这个 <code>.</code> 的（以后会讲到一个类似不能省略的情况）；如果是当前目录的上一级目录，则需要使用 <code>..</code> ，比如你当前目录为 <code>/home/shiyanlou</code> 目录下，根目录就应该表示为 <code>../../</code> ，表示上一级目录（ <code>home</code> 目录）的上一级目录（ <code>/</code> 目录）。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">cd .. #在执行此行命令之前你处在~目录下，</span><br><span class="line">cd .. #两个切换到上一级目录的命令，可以让你处在根目录“/”下</span><br><span class="line"><span class="meta">#</span><span class="bash">此时 ，切换到usr/<span class="built_in">local</span>/bin目录下</span></span><br><span class="line">cd ./usr/local/bin</span><br><span class="line">-     #&quot;-&quot;，这个命令表示切换到上一个与此不同的目录</span><br><span class="line">cd usr/local/bin # 两个命令完成的功能相同，都可以帮你切换到bin目录下</span><br><span class="line">-  # 回到上一次执行时的目录</span><br><span class="line">cd ~ #切换到当前用户的目录下</span><br><span class="line">cd ../../ #表示点击两次上一级目录</span><br></pre></td></tr></table></figure>



<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211020130952.png" alt="image-20211020130950573"></p>
<p>这里你可以观察到，我并没有使用<code>cd</code> 命令，因为在默认情况下，你输入一个路径，它就会自动调用<code>cd</code>命令，你可以发现如果你输入的路径正确，字体会显示为绿色，并且会出现下划线，这都是在告诉我们这是一个合规的路径。</p>
<hr>
<h2 id="Linux环境变量"><a href="#Linux环境变量" class="headerlink" title="Linux环境变量"></a>Linux环境变量</h2><h3 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h3><h4 id="变量"><a href="#变量" class="headerlink" title="变量"></a>变量</h4><p>要解释<strong>环境变量</strong>，得先明白变量是什么，准确的说应该是 Shell 变量，所谓变量就是计算机中用于记录一个值（不一定是数值，也可以是字符或字符串）的符号，而这些符号将用于不同的运算处理中。通常变量与值是一对一的关系，可以通过表达式读取它的值并赋值给其它变量，也可以直接指定数值赋值给任意变量。为了便于运算和处理，大部分的编程语言会区分变量的类型，用于分别记录数值、字符或者字符串等等数据类型。Shell 中的变量也基本如此，有不同类型（但不用专门指定类型名），可以参与运算，有作用域限定。</p>
<blockquote>
<p>变量的作用域即变量的有效范围（比如一个函数中、一个源文件中或者全局范围），在该范围内只能有一个同名变量。一旦离开则该变量无效，如同不存在这个变量一般。</p>
</blockquote>
<p>在 Shell 中如何创建一个变量，如何给变量赋值和如何读取变量的值呢？</p>
<p>想了解请进入 <a target="_blank" rel="noopener" href="https://www.lanqiao.cn/courses/944">高级 bash 脚本编程指南传送门</a> </p>
<p>这里给大家一个简单的例子：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">declare tmp #使用declare命令创建一个名为tmp的变量</span><br></pre></td></tr></table></figure>

<blockquote>
<p>其实也可以不用 declare 预声明一个变量，直接即用即创建，这里只是告诉你 declare 的作用，这在创建其它指定类型的变量（如数组）时会用到。</p>
</blockquote>
<p>使用 <code>=</code> 号赋值运算符，将变量 <code>tmp</code> 赋值为 <code>shiyanlou</code>。</p>
<p>注意，与其他语言不同的是， Shell 中的赋值操作，<code>=</code> 两边不可以输入空格，否则会报错。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash">正确的赋值方式</span></span><br><span class="line">tmp=【变量值】</span><br><span class="line"><span class="meta">#</span><span class="bash">错误的赋值方式</span></span><br><span class="line">tmp = 【变量值】 # 很多人会习惯性的打出空格，嗯，程序员通病</span><br><span class="line">echo $【变量名】 # $ 符号用于表示引用一个变量的值，不要忘记输入</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021131200.png" alt="image-20211021131157584"></p>
<p><strong>注意：并不是任何形式的变量名都是可用的，变量名只能是英文字母、数字或者下划线，且不能以数字作为开头。</strong></p>
<h4 id="环境变量-1"><a href="#环境变量-1" class="headerlink" title="环境变量"></a>环境变量</h4><p>简单理解了变量的概念，就很容易理解环境变量了。环境变量的作用域比自定义变量的要大，如 Shell 的环境变量作用于自身和它的子进程。在所有的 UNIX 和类 UNIX 系统中，每个进程都有其各自的环境变量设置，且默认情况下，当一个进程被创建时，除了创建过程中明确指定的话，它将继承其父进程的绝大部分环境设置。Shell 程序也作为一个进程运行在操作系统之上，而我们在 Shell 中运行的大部分命令都将以 Shell 的子进程的方式运行。</p>
<p><img src="https://doc.shiyanlou.com/linux_base/5-2.png" alt="1"></p>
<p>通常我们会涉及到的变量类型有三种：</p>
<ul>
<li>当前 Shell 进程私有用户自定义变量，如上面我们创建的 <code>tmp </code>变量，只在当前 Shell 中有效。</li>
<li>Shell 本身内建的变量。</li>
<li>从自定义变量导出的环境变量。</li>
</ul>
<p>也有三个与上述三种环境变量相关的命令：<code>set</code>，<code>env</code>，<code>export</code>。这三个命令很相似，都是用于打印环境变量信息，区别在于涉及的变量范围不同。详见下表：</p>
<table>
<thead>
<tr>
<th>命 令</th>
<th>说 明</th>
</tr>
</thead>
<tbody><tr>
<td><code>set</code></td>
<td>显示当前 Shell 所有变量，包括其内建环境变量（与 Shell 外观等相关），用户自定义变量及导出的环境变量。</td>
</tr>
<tr>
<td><code>env</code></td>
<td>显示与当前用户相关的环境变量，还可以让命令在指定环境中运行。</td>
</tr>
<tr>
<td><code>export</code></td>
<td>显示从 Shell 中导出成环境变量的变量，也能通过它将自定义变量导出为环境变量。</td>
</tr>
</tbody></table>
<p><img src="https://doc.shiyanlou.com/linux_base/5-3.png" alt="1"></p>
<p>关于哪些变量是环境变量，可以简单地理解成在当前进程的子进程有效则为环境变量，否则不是（有些人也将所有变量统称为环境变量，只是以全局环境变量和局部环境变量进行区分，我们只要理解它们的实质区别即可）。</p>
<p><strong>注意：为了与普通变量区分，通常我们习惯将环境变量名设为大写。</strong></p>
<h4 id="永久生效"><a href="#永久生效" class="headerlink" title="永久生效"></a>永久生效</h4><p>但是问题来了，当你关机后，或者关闭当前的 shell 之后，环境变量就没了啊。怎么才能让环境变量永久生效呢？</p>
<p>按变量的生存周期来划分，Linux 变量可分为两类：</p>
<ol>
<li>永久的：需要修改配置文件，变量永久生效；</li>
<li>临时的：使用 export 命令行声明即可，变量在关闭 shell 时失效。</li>
</ol>
<p>这里介绍两个重要文件 <code>/etc/bashrc</code>（有的 Linux 没有这个文件） 和 <code>/etc/profile</code> ，它们分别存放的是 shell 变量和环境变量。还有要注意区别的是每个用户目录下的一个隐藏文件：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># .profile 可以用 ls -a 查看</span></span><br><span class="line"><span class="built_in">cd</span> /home/shiyanlou</span><br><span class="line">ls -a</span><br></pre></td></tr></table></figure>

<p><img src="https://doc.shiyanlou.com/courses/uid871732-20200303-1583220161661" alt="图片描述"></p>
<p>这个 .profile 只对当前用户永久生效。因为它保存在当前用户的 Home 目录下，当切换用户时，工作目录可能一并被切换到对应的目录中，这个文件就无法生效。而写在 <code>/etc/profile</code> 里面的是对所有用户永久生效，所以如果想要添加一个永久生效的环境变量，只需要打开 <code>/etc/profile</code>，在最后加上你想添加的环境变量就好啦。</p>
<h3 id="命令的查找路径与顺序"><a href="#命令的查找路径与顺序" class="headerlink" title="命令的查找路径与顺序"></a>命令的查找路径与顺序</h3><p>你是不是早就有疑问，我们在 Shell 中输入一个命令，Shell 是怎么知道去哪找到这个命令然后执行的呢？这是通过环境变量 <code>PATH</code> 来进行搜索的，熟悉 Windows 的用户可能知道 Windows 中的也是有这么一个 PATH 环境变量。这个 <code>PATH</code> 里面就保存了 Shell 中执行的命令的搜索路径。</p>
<p>查看 <code>PATH</code> 环境变量的内容：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo $PATH</span><br></pre></td></tr></table></figure>

<p>默认情况下你会看到如下输出：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games</span><br><span class="line"><span class="meta">#</span><span class="bash">下图环境较为复杂，不是默认情况</span></span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021132341.png" alt="image-20211021132339929"></p>
<p>如果你还记得 Linux 目录结构那一节的内容，你就应该知道上面这些目录下放的是哪一类文件了。通常这一类目录下放的都是可执行文件，当我们在 Shell 中执行一个命令时，系统就会按照 PATH 中设定的路径按照顺序依次到目录中去查找，如果存在同名的命令，则执行先找到的那个。</p>
<blockquote>
<p>下面我们将练习创建一个最简单的可执行 Shell 脚本和一个使用 C 语言创建的“ hello world ”程序，如果这两部分内容你之前没有学习过，那么你可以进行一个入门学习：</p>
</blockquote>
<ul>
<li><a target="_blank" rel="noopener" href="https://www.lanqiao.cn/courses/57">C 语言入门教程</a></li>
<li><a target="_blank" rel="noopener" href="https://www.lanqiao.cn/courses/5">高级 Bash 脚本编程指南</a></li>
<li><a target="_blank" rel="noopener" href="http://bash.cyberciti.biz/guide/Main_Page">Linux Shell Scripting Tutorial (LSST) v2.0</a></li>
</ul>
<p>创建一个 Shell 脚本文件，你可以使用 gedit，vim，sublime 等工具编辑。如果你是直接复制的话，建议使用 gedit 或者 sublime，否则可能导致代码缩进混乱。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cd /home/shiyanlou</span><br><span class="line">touch hello_shell.sh</span><br><span class="line">gedit hello_shell.sh</span><br></pre></td></tr></table></figure>

<p>在脚本中添加如下内容，保存并退出。</p>
<p><strong>注意不要省掉第一行，这不是注释，有用户反映有语法错误，就是因为没有了第一行。</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> ((i=0; i&lt;10; i++));<span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;hello shell&quot;</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">exit</span> 0</span><br></pre></td></tr></table></figure>

<p>为文件添加可执行权限，否则执行会报错没有权限：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod 755 hello_shell.sh #直接执行会是红色的，这是有错误的原因</span><br></pre></td></tr></table></figure>

<p>执行脚本：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./hello_shell.sh</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021132715.png" alt="image-20211021132713592"></p>
<p>创建一个 C 语言 <code>hello world</code> 程序：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd /home/shiyanlou</span><br><span class="line">gedit hello_world.c</span><br></pre></td></tr></table></figure>

<p>输入如下内容，同样不能省略第一行。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;hello world!\n&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>保存后使用 <code>gcc </code>生成可执行文件：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc -o hello_world hello_world.c</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021133130.png" alt="image-20211021133129474"></p>
<p><strong>gcc 生成二进制文件默认具有可执行权限，不需要修改。</strong></p>
<p>在 <code>/home/shiyanlou</code> 家目录创建一个 <code>mybin</code> 目录，并将上述 <code>hello_shell.sh</code> 和 <code>hello_world</code> 文件移动到其中：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /home/shiyanlou</span><br><span class="line">mkdir mybin</span><br><span class="line">mv hello_shell.sh hello_world mybin/</span><br></pre></td></tr></table></figure>

<p>现在你可以在 <code>mybin</code> 目录中分别运行你刚刚创建的两个程序：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> mybin</span><br><span class="line">./hello_shell.sh</span><br><span class="line">./hello_world</span><br></pre></td></tr></table></figure>

<p><img src="https://doc.shiyanlou.com/document-uid735639labid60timestamp1532339433567.png" alt="此处输入图片的描述"></p>
<p>回到上一级目录，也就是 <code>shiyanlou</code> 家目录，当再想运行那两个程序时，会发现提示命令找不到，除非加上命令的完整路径，但那样很不方便，如何做到像使用系统命令一样执行自己创建的脚本文件或者程序呢？那就要将命令所在路径添加到 <code>PATH</code> 环境变量了。</p>
<h3 id="添加全局变量"><a href="#添加全局变量" class="headerlink" title="添加全局变量"></a>添加全局变量</h3><p>此处的全局变量是指：添加自定义环境变量到PATH</p>
<p>在前面我们应该注意到 <code>PATH</code> 里面的路径是以 <code>:</code> 作为分割符的，所以我们可以这样添加自定义路径：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PATH=<span class="variable">$PATH</span>:/home/shiyanlou/mybin</span><br></pre></td></tr></table></figure>

<p><strong>注意这里一定要使用绝对路径。</strong></p>
<p>现在你就可以在任意目录执行那两个命令了（注意需要去掉前面的 <code>./</code>）。你可能会意识到这样还并没有很好的解决问题，因为我给 PATH 环境变量追加了一个路径，它也只是在当前 Shell 有效，我一旦退出终端，再打开就会发现又失效了。有没有方法让添加的环境变量<strong>全局有效</strong>？或者每次启动 Shell 时自动执行上面添加自定义路径到 PATH 的命令？下面我们就来说说后一种方式——让它自动执行。</p>
<p>这里插一句，如何查看当前shell启动的是<code>zsh</code>还是<code>bash</code>，此时你可以输入<code>echo $0</code>。关于<code>zsh</code>和<code>bash</code>的区别可以查看<a href="#">zsh和bash的区别</a></p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo $0</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211021133609.png" alt="image-20211021133608363"></p>
<p>在每个用户的 home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本，以初始化环境，包括添加一些用户自定义环境变量等等。实验楼的环境使用的 Shell 是 zsh，它的配置文件是 <code>.zshrc</code>，相应的如果使用的 Shell 是 Bash，则配置文件为 <code>.bashrc</code>。它们在 <code>etc</code> 下还都有一个或多个全局的配置文件，不过我们一般只修改用户目录下的配置文件。Shell 的种类有很多，可以使用 <code>cat /etc/shells</code> 命令查看当前系统已安装的 Shell。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /etc/shells</span><br></pre></td></tr></table></figure>



<p><img src="https://doc.shiyanlou.com/courses/uid871732-20200303-1583223324878" alt="图片描述"></p>
<p>我们可以简单地使用下面命令直接添加内容到 <code>.zshrc</code> 中：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;PATH=<span class="variable">$PATH</span>:/home/shiyanlou/mybin&quot;</span> &gt;&gt; .zshrc</span><br></pre></td></tr></table></figure>

<p><strong>上述命令中 <code>&gt;&gt;</code> 表示将标准输出以追加的方式重定向到一个文件中，注意前面用到的 <code>&gt;</code> 是以覆盖的方式重定向到一个文件中，使用的时候一定要注意分辨。在指定文件不存在的情况下都会创建新的文件。</strong></p>
<h3 id="修改和删除变量"><a href="#修改和删除变量" class="headerlink" title="修改和删除变量"></a>修改和删除变量</h3><h4 id="变量修改"><a href="#变量修改" class="headerlink" title="变量修改"></a>变量修改</h4><p>变量的修改有以下几种方式：</p>
<table>
<thead>
<tr>
<th>变量设置方式</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>$&#123;变量名#匹配字串&#125;</code></td>
<td>从头向后开始匹配，删除符合匹配字串的最短数据</td>
</tr>
<tr>
<td><code>$&#123;变量名##匹配字串&#125;</code></td>
<td>从头向后开始匹配，删除符合匹配字串的最长数据</td>
</tr>
<tr>
<td><code>$&#123;变量名%匹配字串&#125;</code></td>
<td>从尾向前开始匹配，删除符合匹配字串的最短数据</td>
</tr>
<tr>
<td><code>$&#123;变量名%%匹配字串&#125;</code></td>
<td>从尾向前开始匹配，删除符合匹配字串的最长数据</td>
</tr>
<tr>
<td><code>$&#123;变量名/旧的字串/新的字串&#125;</code></td>
<td>将符合旧字串的第一个字串替换为新的字串</td>
</tr>
<tr>
<td><code>$&#123;变量名//旧的字串/新的字串&#125;</code></td>
<td>将符合旧字串的全部字串替换为新的字串</td>
</tr>
</tbody></table>
<p><strong>提示：</strong>操作环境变量时要小心，最好做个备份，或者先建立临时变量，拿临时变量测试，测试成功后再修改实际变量。当然环境变量只要你不是删除，其实都还好，不会引起太大的问题。</p>
<p>此处我会建立一个<code>mypath</code>的临时环境变量来做下面的测试，如果你执行了上一节的测试，那么你可以直接跳过这一步，到[删除环境变量](# 删除环境变量)。</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">declare mypath #建立临时变量mypath</span><br><span class="line">echo $mypath   #查看临时变量的值</span><br><span class="line">mypath=$PATH   #将PATH得值赋给临时变量</span><br><span class="line">echo $mypath   #再次输出检测，在做实验的时候，要经常用命令检测自己的上一步是否是正确的，不要嫌麻烦这样既锻炼我们对命令的掌握程度，又能加强我们对命令的掌握</span><br><span class="line">PATH=$PATH:/home/shiyanlou/mybin #将用户目录下的mybin加入环境变量</span><br><span class="line">echo $mypath   #再次输出检测，此时发现，当前临时变量的值改动之前的PATH值，应该重新对其赋值</span><br><span class="line">mypath=$PATH   #对其重新赋值</span><br><span class="line">echo $mypath   #再次输出检测，此时发现，等于改动之后的值，说明我们修改成功了</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211022131312.png" alt="image-20211022125619310"></p>
<h4 id="修改环境变量"><a href="#修改环境变量" class="headerlink" title="修改环境变量"></a>修改环境变量</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">【环境变量名】=$&#123;【环境变量名】%【待修改的变量值】&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash">这个原理就是环境变量的值减去待修改变量的值【%就是减去的意思，也可以看成是除】</span></span><br></pre></td></tr></table></figure>

<p>如下：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">echo $mypath   #同样的，输出检测</span><br><span class="line">mypath=$&#123;mypath%/home/shiyanlou/mybin&#125;</span><br><span class="line"><span class="meta">#</span><span class="bash"> 或者使用如下命令，下面命令用到了通配符的知识，*表示多个任意字符</span></span><br><span class="line">mypath=$&#123;mypath%:*/mybin&#125; #【：*/mybin】可以理解为从【：】开始到【/mybin】的最短字符串</span><br><span class="line">echo $mypath   #同样的，输出检测</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211022131257.png" alt="image-20211022131255907"></p>
<h4 id="变量删除"><a href="#变量删除" class="headerlink" title="变量删除"></a>变量删除</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">unset 【变量名】</span><br><span class="line"><span class="meta">#</span><span class="bash">例</span></span><br><span class="line">unset mypath</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20211022133342.png" alt="image-20211022133340809"></p>
<p>此时在输出已经找不到值了。</p>
<h3 id="使环境变量生效"><a href="#使环境变量生效" class="headerlink" title="使环境变量生效"></a>使环境变量生效</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">source 【文件名】</span><br><span class="line"><span class="meta">#</span><span class="bash"> 或</span></span><br><span class="line">. 【待执行文件的相对路径或绝对路径】 # 注意如果待执行文件在当前目录下 需要在前面加上&#x27;./&#x27;，不然会报找不到</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211024215123049.png" alt="image-20211024215123049"></p>
<p>注意第一个点后面有一个空格，而且后面的文件必须指定完整的绝对或相对路径名，<code>source</code> 则不需要。</p>
<hr>
<h2 id="Linux文件系统"><a href="#Linux文件系统" class="headerlink" title="Linux文件系统"></a>Linux文件系统</h2><p>本节实验的文件系统操作的内容十分简单，只会包含几个命令的几个参数的讲解，但掌握这些也将对你在学习 Linux 和实验楼后续其他课程的过程中有极大帮助。</p>
<blockquote>
<p>因为本课程的定位为入门基础，尽快上手，故没有打算涉及太多理论内容，前面省略了关于 Linux 文件系统的一些基本知识，也因为我们是在线实验环境，所以也避开了很少一部分但又十分重要的关于硬件的内容，我们只能期待用户能够抱着提高自学能力的心态自己去补充相关的知识。</p>
</blockquote>
<h3 id="查看磁盘容量"><a href="#查看磁盘容量" class="headerlink" title="查看磁盘容量"></a>查看磁盘容量</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df # 就这样</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025215818680.png" alt="image-20211025215818680"></p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025215850033.png" alt="image-20211025215850033"></p>
<p>物理主机上的 <code>/dev/sda2</code> 是对应着主机硬盘的分区，后面的数字表示分区号，数字前面的字母 a 表示第几块硬盘（也可能是可移动磁盘），你如果主机上有多块硬盘则可能还会出现 <code>/dev/sdb</code>，<code>/dev/sdc</code> 这些磁盘设备都会在 <code>/dev</code> 目录下以文件的存在形式。</p>
<p>接着你还会看到”1k-块”这个陌生的东西，它表示以磁盘块大小的方式显示容量，后面为相应的以块大小表示的已用和可用容量，在你了解 Linux 的文件系统之前这个就先不管吧，我们以一种你应该看得懂的方式展示：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df -h</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025221843194.png" alt="image-20211025221843194"></p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025221909023.png" alt="image-20211025221909023"></p>
<h3 id="查看目录容量"><a href="#查看目录容量" class="headerlink" title="查看目录容量"></a>查看目录容量</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">du </span><br><span class="line"><span class="meta">#</span><span class="bash"> 只查看 1 级目录的信息</span></span><br><span class="line">du -d 0 ~</span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看 2 级</span></span><br><span class="line">du -d 1 ~</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash">常用参数</span></span><br><span class="line">du -h # 同 --human-readable 以 K，M，G 为单位，提高信息的可读性。</span><br><span class="line">du -a # 同 --all 显示目录中所有文件的大小。</span><br><span class="line">du -s # 同 --summarize 仅显示总计，只列出最后加总的值。</span><br></pre></td></tr></table></figure>

<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025222214153.png" alt="image-20211025222214153"></p>
<p><img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/image-20211025222246563.png" alt="image-20211025222246563"></p>
<p><code>du</code>（estimate file space usage：估计文件空间使用率）命令与 <code>df</code>（report file system disk space usage）命令只有一字之差，希望大家注意不要弄混淆了，你可以像我这样从 man 手册中获取命令的完整描述，记全称就不会搞混了。</p>
<h3 id="虚拟磁盘"><a href="#虚拟磁盘" class="headerlink" title="虚拟磁盘"></a>虚拟磁盘</h3><h4 id="dd-命令简介"><a href="#dd-命令简介" class="headerlink" title="dd 命令简介"></a>dd 命令简介</h4><p><code>dd</code> 命令用于转换和复制文件，不过它的复制不同于 <code>cp</code>。之前提到过关于 Linux 的很重要的一点，<strong>一切即文件</strong>，在 Linux 上，硬件的设备驱动（如硬盘）和特殊设备文件（如 <code>/dev/zero</code> 和 <code>/dev/random</code>）都像普通文件一样，只是在各自的驱动程序中实现了对应的功能，<code>dd</code> 也可以读取文件或写入这些文件。这样，<code>dd</code> 也可以用在备份硬件的引导扇区、获取一定数量的随机数据或者空数据等任务中。<code>dd</code> 程序也可以在复制时处理数据，例如转换字节序、或在 ASCII 与 EBCDIC 编码间互换。</p>
<p><code>dd</code> 的命令行语句与其他的 Linux 程序不同，因为它的命令行选项格式为 <strong>选项=值</strong>，而不是更标准的 <strong>–选项 值</strong> 或 <strong>-选项=值</strong>。<code>dd</code> 默认从标准输入中读取，并写入到标准输出中，但可以用选项 <code>if</code>（input file，输入文件）和 <code>of</code>（output file，输出文件）改变。</p>
<p>我们先来试试用 <code>dd</code> 命令从标准输入读入用户的输入到标准输出或者一个文件中</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 输出到文件</span></span><br><span class="line">dd of=test bs=10 count=1 </span><br><span class="line"><span class="meta">#</span><span class="bash"> 或者</span> </span><br><span class="line">dd if=/dev/stdin of=test bs=10 count=1</span><br><span class="line"><span class="meta">#</span><span class="bash"> 输出到标准输出</span></span><br><span class="line">dd if=/dev/stdin of=/dev/stdout bs=10 count=1</span><br><span class="line"><span class="meta">#</span><span class="bash"> 在打完了这个命令后，继续在终端打字，作为你的输入</span></span><br></pre></td></tr></table></figure>



<p>上述命令从标准输入设备读入用户输入（缺省值，所以可省略）然后输出到 test 文件，<code>bs</code>（block size）用于指定块大小（缺省单位为 Byte，也可为其指定如 <code>K</code>，<code>M</code>，<code>G</code> 等单位），<code>count</code> 用于指定块数量。如上图所示，我指定只读取总共 10 个字节的数据，当我输入了 <code>hello shiyanlou</code> 之后加上空格回车总共 16 个字节（一个英文字符占一个字节）内容，显然超过了设定大小。使用 <code>du</code> 和 <code>cat</code> 10 个字节（那个黑底百分号表示这里没有换行符），而其他的多余输入将被截取并保留在标准输入。</p>
<p>前面说到 <code>dd</code> 在拷贝的同时还可以实现数据转换，那下面就举一个简单的例子：将输出的英文字符转换为大写再写入文件</p>
<h2 id="Linux下载器"><a href="#Linux下载器" class="headerlink" title="Linux下载器"></a>Linux下载器</h2><blockquote>
<p>Linux系统一般来说分为两大派系：</p>
<ul>
<li>RedHat<ul>
<li>RedHat</li>
<li>CentOS</li>
<li>Fedora</li>
</ul>
</li>
<li>Debian<ul>
<li>Debian</li>
<li>Ubuntu</li>
</ul>
</li>
</ul>
<p>参考：<a target="_blank" rel="noopener" href="https://blog.csdn.net/mier9042/article/details/80612707">https://blog.csdn.net/mier9042/article/details/80612707</a></p>
</blockquote>
<h3 id="RedHat"><a href="#RedHat" class="headerlink" title="RedHat"></a>RedHat</h3><h4 id="安装包"><a href="#安装包" class="headerlink" title="安装包"></a>安装包</h4><blockquote>
<p>红帽系的安装包多以.rpm结尾，安装命令为。</p>
</blockquote>
<h3 id="Debian"><a href="#Debian" class="headerlink" title="Debian"></a>Debian</h3><hr>
<h1 id="Vim编辑器"><a href="#Vim编辑器" class="headerlink" title="Vim编辑器"></a>Vim编辑器</h1><hr>
<h1 id="正则表达式"><a href="#正则表达式" class="headerlink" title="正则表达式"></a>正则表达式</h1><hr>
<h1 id="BASH脚本"><a href="#BASH脚本" class="headerlink" title="BASH脚本"></a>BASH脚本</h1><hr>
<hr>
<h1 id="扩展-1"><a href="#扩展-1" class="headerlink" title="扩展"></a>扩展</h1>
      
    </div><!-- .entry-content -->

    <footer class="entry-meta">
    <a href="/2021/09/15/Linux/">
    <time datetime="2021-09-14T16:00:00.000Z" class="entry-date">
        2021-09-15
    </time>
</a>
    
    
    </footer>
</article>


    
<nav class="nav-single">
    <h3 class="assistive-text">文章导航</h3>
    
        <span class="nav-previous"><a href="/2021/09/15/DateStructor/" rel="prev"><span class="meta-nav">←</span> Date Structor ---  数据结构</a></span>
    
    
        <span class="nav-next"><a href="/2021/08/11/Idea/" rel="next">Idea <span class="meta-nav">→</span></a></span>
    
</nav><!-- .nav-single -->






<section id="comments">
  <!-- 多说评论框 start -->
  <div class="ds-thread" data-thread-key="post-Linux" data-title="Linux学习" data-url="https://masuo777.github.io/2021/09/15/Linux/"></div>
  <!-- 多说评论框 end -->
  <!-- 多说公共JS代码 start (一个网页只需插入一次) -->
  <script type="text/javascript">
  var duoshuoQuery = {short_name:'ms'};
    (function() {
	  var ds = document.createElement('script');
	  ds.type = 'text/javascript';ds.async = true;
	  ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
	  ds.charset = 'UTF-8';
	  (document.getElementsByTagName('head')[0]
	   || document.getElementsByTagName('body')[0]).appendChild(ds);
    })();
  </script>
  <!-- 多说公共JS代码 end -->
</section>


</div></div>
        <div id="secondary" class="widget-area" role="complementary">
  
    <aside class="widget">
    <h3 class="widget-title">CONTACT ME</h3>
    <div class="widget-content">
      <p>邮箱：masuo0.0@foxmail.com</p>
      <p>QQ：2919029885</p>
      <a target="_blank" rel="noopener" href="https://www.cnblogs.com/msdog/">博客园</a>
      </br>
      <img src="https://masuo-github-image.oss-cn-beijing.aliyuncs.com/image/20210701223301.jpg" height="250px"/>
      
    </div>
</aside>
  
    <aside class="widget">
    <h3 class="widget-title">赞助我</h3>
    <div class="widget-content">
      <img src='/css/images/alipay.png' style='width:100%;' />
    </div>
</aside>
  
    <aside class="widget">
    <h3 class="widget-title">公众号</h3>
    <div class="widget-content">
      <p>暂时没有，待我代码行数100000，我可能才有这个资格吧。</p>
      <p></p>
    </div>
</aside>
  
</div>
      </div>
      <footer id="colophon" role="contentinfo">
    <p>&copy; 2022 John Doe; All rights reserved.</p>
    <p>Powered by <a href="http://hexo.io/" target="_blank">Hexo</a></p>
</footer>
    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"1","bdMiniList":false,"bdPic":"","bdStyle":"2","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>

<script src="/js/jquery-2.0.3.min.js"></script>


  
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css">

  
<script src="/fancybox/jquery.fancybox.pack.js"></script>




<script src="/js/script.js"></script>


<script src="/js/navigation.js"></script>

<div id="bg"></div>

  </div>
</body>
</html>